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?
„Das Datenmodell Rekursion erfordert“ - es gibt keine Vorstellung von rekursiven Mapping in ES, also nicht erwarten, die Bibliothek Unterstützung Das. – khachik
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
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