0

나는 Spring Data Elastic을 사용하여 Elasticsearch 데이터에 액세스하는 Spring 응용 프로그램이 있습니다.Spring 데이터 탄성 및 재귀 적 문서 매핑

데이터 모델에 재귀가 필요하며 내 응용 프로그램을 실행하려고 할 때 java.lang.StackOverflowError : null이 발생하므로 Spring Data Elastic에 대한 두통이 발생합니다. 내 수업이 어떻게 보이는지

이입니다

@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; 

    ... 

중첩 된 클래스 :

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; 

    ... 

이이 코드를 실행하려고 내가 얻을 예외입니다 :

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] 

아이디어가 있으십니까?

+0

:

이 내 메일 폴더 클래스가 순간에 모습입니다 그. – khachik

+0

어쩌면 잘못된 용어를 사용하고 있었을 지 모르겠지만 작업이 명확하기를 바란다 : 동일한 유형의 문서를 저장할 수있는 문서를 저장하고 싶다. 그게 가능합니까, 그렇지 않은가요? – SaWo

+0

자바 수준의 재귀를 사용할 수 없다는 점을 제외하고는 해당 매핑을 정의 할 수 있습니다. 정의를 복사하여 복사하여 유한 매핑이 필요합니다. 또는 동적 매핑으로 전환하면 스프링 데이터가이를 지원하는지 모르겠습니다. – khachik

답변

0

많은 연구 끝에 해결책을 찾았으므로 커뮤니티와 공유하고 싶었습니다. 아마도 다른 사람에게도 유용 할 것입니다. 봄 데이터 Elasticsearch이 재귀 스키마를 매핑 할 때

가 StackOverflowExpcetion을 방지하기 위해, 당신은 매퍼가 무한 루프에 가지 않을 것이다, 그래서 @Field 주석 내에서 ignoreFields 속성을 사용합니다. ES의 재귀 매핑의 아무 개념이없는, 그래서 지원 라이브러리를 기대하지 않는다 - "데이터 모델은 재귀가 필요합니다"

... 
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; 
...