From 680e07726fd2fe70a9a1f90c2dfd71abbf17ec1e Mon Sep 17 00:00:00 2001 From: Jakub Vavrik Date: Fri, 11 Oct 2013 13:05:13 +0200 Subject: [PATCH] Added simple fix for infinite recursion in entity mapping if class contains a field of same type as the class. In such case will skip that field. --- .../data/elasticsearch/core/MappingBuilder.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/springframework/data/elasticsearch/core/MappingBuilder.java b/src/main/java/org/springframework/data/elasticsearch/core/MappingBuilder.java index 2b27e26e5..bb77c9824 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/MappingBuilder.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/MappingBuilder.java @@ -25,7 +25,9 @@ import org.springframework.data.util.ClassTypeInformation; import org.springframework.data.util.TypeInformation; import java.io.IOException; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import static org.apache.commons.lang.StringUtils.EMPTY; import static org.apache.commons.lang.StringUtils.isNotBlank; @@ -57,14 +59,13 @@ class MappingBuilder { static XContentBuilder buildMapping(Class clazz, String indexType, String idFieldName) throws IOException { XContentBuilder xContentBuilder = jsonBuilder().startObject().startObject(indexType).startObject(FIELD_PROPERTIES); - mapEntity(xContentBuilder, clazz, true, idFieldName, EMPTY); + mapEntity(xContentBuilder, clazz, true, idFieldName, EMPTY, new HashSet()); return xContentBuilder.endObject().endObject().endObject(); } private static void mapEntity(XContentBuilder xContentBuilder, Class clazz, boolean isRootObject, String idFieldName, - String nestedObjectFieldName) throws IOException { - + String nestedObjectFieldName, Set ancestorClasses) throws IOException { java.lang.reflect.Field[] fields = clazz.getDeclaredFields(); if (!isRootObject && isAnyPropertyAnnotatedAsField(fields)) { @@ -78,7 +79,12 @@ class MappingBuilder { } if (isEntity(field)) { - mapEntity(xContentBuilder, field.getType(), false, EMPTY, field.getName()); + if (ancestorClasses.contains(field.getType())) { + continue; + } else { + ancestorClasses.add(field.getType()); + mapEntity(xContentBuilder, field.getType(), false, EMPTY, field.getName(), ancestorClasses); + } } Field singleField = field.getAnnotation(Field.class);