0

Ich habe eine Spring-Anwendung, in der ich Spring Data Elastic für den Zugriff auf Elasticsearch-Daten verwende.Spring Data Elastische und rekursive Dokumentzuordnung

Das Datenmodell erfordert Rekursion und es verursacht Kopfschmerzen für Spring Data Elastic, weil ich java.lang.StackOverflowError: null, beim Versuch, meine App zu starten. Diese

ist, wie meine Klasse wie folgt aussieht:

@Document(indexName = "conversation", type = "folder-tree") 
public class MailFolderTreeSearchEntity extends DeletableEntity { 

    @Id 
    @Field(index = not_analyzed) 
    private String id; 

    @Field(type = FieldType.String, index = not_analyzed) 
    private String owner; 

    @Field(type = FieldType.Nested) 
    private List<MailFolder> folderList; 

    ... 

Die verschachtelte Klasse:

public class MailFolder { 

    @Field(type = FieldType.String, index = not_analyzed) 
    private String id; 

    @Field(type = FieldType.String, index = not_analyzed) 
    private String name; 

    @Field(type = FieldType.String, index = not_analyzed) 
    private String icon; 

    @Field(type = FieldType.Nested) 
    private List<MailFolder> children; 

    ... 

und dies ist die Ausnahme, die ich bekommen, wenn man versucht, den Code auszuführen:

Caused by: java.lang.StackOverflowError: null 
at sun.reflect.generics.parser.SignatureParser.parseClassTypeSignature(SignatureParser.java:310) ~[na:1.8.0_91] 
at sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:289) ~[na:1.8.0_91] 
at sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:283) ~[na:1.8.0_91] 
at sun.reflect.generics.parser.SignatureParser.parseTypeArgument(SignatureParser.java:436) ~[na:1.8.0_91] 
at sun.reflect.generics.parser.SignatureParser.parseTypeArguments(SignatureParser.java:396) ~[na:1.8.0_91] 
at sun.reflect.generics.parser.SignatureParser.parsePackageNameAndSimpleClassTypeSignature(SignatureParser.java:346) ~[na:1.8.0_91] 
at sun.reflect.generics.parser.SignatureParser.parseClassTypeSignature(SignatureParser.java:310) ~[na:1.8.0_91] 
at sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:289) ~[na:1.8.0_91] 
at sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:283) ~[na:1.8.0_91] 
at sun.reflect.generics.parser.SignatureParser.parseTypeSignature(SignatureParser.java:485) ~[na:1.8.0_91] 
at sun.reflect.generics.parser.SignatureParser.parseTypeSig(SignatureParser.java:188) ~[na:1.8.0_91] 
at sun.reflect.generics.repository.FieldRepository.parse(FieldRepository.java:52) ~[na:1.8.0_91] 
at sun.reflect.generics.repository.FieldRepository.parse(FieldRepository.java:42) ~[na:1.8.0_91] 
at sun.reflect.generics.repository.AbstractRepository.<init>(AbstractRepository.java:74) ~[na:1.8.0_91] 
at sun.reflect.generics.repository.FieldRepository.<init>(FieldRepository.java:48) ~[na:1.8.0_91] 
at sun.reflect.generics.repository.FieldRepository.make(FieldRepository.java:66) ~[na:1.8.0_91] 
at java.lang.reflect.Field.getGenericInfo(Field.java:105) ~[na:1.8.0_91] 
at java.lang.reflect.Field.getGenericType(Field.java:247) ~[na:1.8.0_91] 
at org.springframework.core.SerializableTypeWrapper$FieldTypeProvider.getType(SerializableTypeWrapper.java:285) ~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.core.SerializableTypeWrapper.forTypeProvider(SerializableTypeWrapper.java:150) ~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.core.ResolvableType.forType(ResolvableType.java:1333) ~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.core.ResolvableType.forField(ResolvableType.java:1053) ~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.core.GenericCollectionTypeResolver.getCollectionFieldType(GenericCollectionTypeResolver.java:79) ~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.data.elasticsearch.core.MappingBuilder.getFieldType(MappingBuilder.java:321) ~[spring-data-elasticsearch-2.1.3.RELEASE.jar:na] 
at org.springframework.data.elasticsearch.core.MappingBuilder.isEntity(MappingBuilder.java:312) ~[spring-data-elasticsearch-2.1.3.RELEASE.jar:na] 
at org.springframework.data.elasticsearch.core.MappingBuilder.mapEntity(MappingBuilder.java:132) ~[spring-data-elasticsearch-2.1.3.RELEASE.jar:na] 
at org.springframework.data.elasticsearch.core.MappingBuilder.mapEntity(MappingBuilder.java:137) ~[spring-data-elasticsearch-2.1.3.RELEASE.jar:na] 
at org.springframework.data.elasticsearch.core.MappingBuilder.mapEntity(MappingBuilder.java:137) ~[spring-data-elasticsearch-2.1.3.RELEASE.jar:na] 
at org.springframework.data.elasticsearch.core.MappingBuilder.mapEntity(MappingBuilder.java:137) ~[spring-data-elasticsearch-2.1.3.RELEASE.jar:na] 
at org.springframework.data.elasticsearch.core.MappingBuilder.mapEntity(MappingBuilder.java:137) ~[spring-data-elasticsearch-2.1.3.RELEASE.jar:na] 

Irgendwelche Ideen?

+0

„Das Datenmodell Rekursion erfordert“ - es gibt keine Vorstellung von rekursiven Mapping in ES, also nicht erwarten, die Bibliothek Unterstützung Das. – khachik

+0

Vielleicht habe ich die falsche Terminologie verwendet, aber ich hoffe, die Aufgabe ist klar: Ich möchte Dokumente speichern, die dieselbe Art von Dokumenten in sich speichern können. Ist das überhaupt möglich oder nicht? – SaWo

+0

Es ist möglich, außer dass Sie keine Java-Level-Rekursion verwenden können, diese Zuordnung zu definieren. Sie müssen eine endliche Zuordnung haben, indem Sie Ihre Definitionen kopieren. Oder wechseln Sie zum dynamischen Mapping, ich weiß nicht, ob Spring-Daten dies unterstützen. – khachik

Antwort

0

Nach vielen Tagen der Forschung fand ich die Lösung, also wollte ich es mit der Community teilen, vielleicht wird es auch für jemand anderen nützlich sein.

die StackOverflowExpcetion zu vermeiden, wenn der Spring Data Elasticsearch versucht Ihr rekursive Schema abzubilden, müssen Sie innerhalb der @Field Annotation das ignoreFields Attribut verwenden, so dass der Mapper nicht in eine Endlosschleife gehen.

Dies ist, wie meine Mailordner Klasse im Moment aussieht:

... 
public class MailFolder { 

@Field(type = FieldType.String, index = not_analyzed) 
private String id; 

@Field(type = FieldType.String, index = not_analyzed) 
private String name; 

@Field(type = FieldType.String, index = not_analyzed) 
private String icon; 

@Field(type = FieldType.Boolean, index = not_analyzed) 
private boolean system; 

@Field(type = FieldType.Nested, ignoreFields = {"children"}) 
private List<MailFolder> children; 
...