Skip to content

Commit 2305fc8

Browse files
committed
Merge pull request spring-projects#9 from stuartstevenson/master
MappingBuilder circular reference issue
2 parents 3e7e262 + c8861eb commit 2305fc8

File tree

4 files changed

+56
-1
lines changed

4 files changed

+56
-1
lines changed

src/main/java/org/springframework/data/elasticsearch/annotations/Field.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,6 @@
4343

4444
String indexAnalyzer() default "";
4545

46+
String [] ignoreFields() default {};
47+
4648
}

src/main/java/org/springframework/data/elasticsearch/core/MappingBuilder.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.data.util.TypeInformation;
2525

2626
import java.io.IOException;
27+
import java.util.Arrays;
2728
import java.util.Map;
2829

2930
import static org.apache.commons.lang.StringUtils.EMPTY;
@@ -71,7 +72,7 @@ private static void mapEntity(XContentBuilder xContentBuilder, Class clazz, bool
7172
}
7273

7374
for (java.lang.reflect.Field field : fields) {
74-
if (isEntity(field)) {
75+
if (isEntity(field) && !isInIgnoreFields(field)) {
7576
mapEntity(xContentBuilder, field.getType(), false, EMPTY, field.getName());
7677
}
7778

@@ -246,4 +247,13 @@ private static boolean isAnyPropertyAnnotatedAsField(java.lang.reflect.Field[] f
246247
private static boolean isIdField(java.lang.reflect.Field field, String idFieldName) {
247248
return idFieldName.equals(field.getName());
248249
}
250+
251+
private static boolean isInIgnoreFields(java.lang.reflect.Field field) {
252+
Field fieldAnnotation = field.getAnnotation(Field.class);
253+
if ( null != fieldAnnotation ) {
254+
String [] ignoreFields = fieldAnnotation.ignoreFields();
255+
return Arrays.asList(ignoreFields).contains(field.getName());
256+
}
257+
return false;
258+
}
249259
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.springframework.data.elasticsearch.core;
2+
3+
import org.springframework.data.annotation.Id;
4+
import org.springframework.data.elasticsearch.annotations.Document;
5+
import org.springframework.data.elasticsearch.annotations.Field;
6+
import org.springframework.data.elasticsearch.annotations.FieldType;
7+
8+
/**
9+
* @author Stuart Stevenson
10+
*/
11+
@Document(indexName = "circular-objects", type = "circular-object" , indexStoreType = "memory", shards = 1, replicas = 0, refreshInterval = "-1")
12+
public class CircularObject {
13+
14+
@Id
15+
private String id;
16+
@Field(type = FieldType.Object, ignoreFields = {"circularObject"})
17+
private CircularObject circularObject;
18+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.springframework.data.elasticsearch.core;
2+
3+
import org.junit.Test;
4+
import org.junit.runner.RunWith;
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.test.context.ContextConfiguration;
7+
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
8+
9+
/**
10+
* @author Stuart Stevenson
11+
*/
12+
@RunWith(SpringJUnit4ClassRunner.class)
13+
@ContextConfiguration("classpath:elasticsearch-template-test.xml")
14+
public class MappingBuilderTests {
15+
16+
@Autowired
17+
private ElasticsearchTemplate elasticsearchTemplate;
18+
19+
@Test
20+
public void shouldNotFailOnCircularReference() {
21+
elasticsearchTemplate.createIndex(CircularObject.class);
22+
elasticsearchTemplate.putMapping(CircularObject.class);
23+
}
24+
25+
}

0 commit comments

Comments
 (0)