spring-data-elasticsearch,Java,Recursion,Spring Data,Stack Overflow,spring Data Elasticsearch" /> spring-data-elasticsearch,Java,Recursion,Spring Data,Stack Overflow,spring Data Elasticsearch" />

Java Spring数据弹性和递归文档映射

Java Spring数据弹性和递归文档映射,java,recursion,spring-data,stack-overflow,spring-data-elasticsearch,Java,Recursion,Spring Data,Stack Overflow,spring Data Elasticsearch,我有一个Spring应用程序,使用Spring数据Elastic访问Elasticsearch数据 数据模型需要递归,这让Spring data Elastic感到头疼,因为我在尝试运行我的应用程序时得到了java.lang.StackOverflowerError:null 我的班级是这样的: @Document(indexName = "conversation", type = "folder-tree") public class MailFolderTreeSearchEntity e

我有一个Spring应用程序,使用Spring数据Elastic访问Elasticsearch数据


数据模型需要递归,这让Spring data Elastic感到头疼,因为我在尝试运行我的应用程序时得到了java.lang.StackOverflowerError:null

我的班级是这样的:

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

  ...
@文档(indexName=“conversation”,type=“文件夹树”)
公共类MailFolderTreeSearchenity扩展了DeletableEntity{
@身份证
@字段(索引=未分析)
私有字符串id;
@字段(类型=字段类型.字符串,索引=未分析)
私人字符串所有者;
@字段(类型=字段类型.嵌套)
私有列表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;

  ...
公共类邮件文件夹{
@字段(类型=字段类型.字符串,索引=未分析)
私有字符串id;
@字段(类型=字段类型.字符串,索引=未分析)
私有字符串名称;
@字段(类型=字段类型.字符串,索引=未分析)
私有字符串图标;
@字段(类型=字段类型.嵌套)
私人名单儿童;
...
这是我在尝试运行代码时遇到的例外情况:

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]
原因:java.lang.StackOverflower错误:null
在sun.reflect.generics.parser.SignatureParser.parseClassTypeSignature(SignatureParser.java:310)~[na:1.8.091]
在sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:289)~[na:1.8.091]
在sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:283)~[na:1.8.091]
在sun.reflect.generics.parser.SignatureParser.parseTypeArgument(SignatureParser.java:436)~[na:1.8.091]
在sun.reflect.generics.parser.SignatureParser.parseTypeArguments(SignatureParser.java:396)~[na:1.8.091]
在sun.reflect.generics.parser.SignatureParser.ParsePackageNamedSimpleClassTypeSignature(SignatureParser.java:346)~[na:1.8.091]
在sun.reflect.generics.parser.SignatureParser.parseClassTypeSignature(SignatureParser.java:310)~[na:1.8.091]
在sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:289)~[na:1.8.091]
在sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:283)~[na:1.8.091]
在sun.reflect.generics.parser.SignatureParser.parseTypeSignature(SignatureParser.java:485)~[na:1.8.091]
在sun.reflect.generics.parser.SignatureParser.parseTypeSig(SignatureParser.java:188)~[na:1.8.091]
在sun.reflect.generics.repository.FieldRepository.parse(FieldRepository.java:52)~[na:1.8.091]
在sun.reflect.generics.repository.FieldRepository.parse(FieldRepository.java:42)~[na:1.8.091]
在sun.reflect.generics.repository.AbstractRepository.(AbstractRepository.java:74)~[na:1.8.091]
在sun.reflect.generics.repository.FieldRepository.(FieldRepository.java:48)~[na:1.8.091]
在sun.reflect.generics.repository.FieldRepository.make(FieldRepository.java:66)~[na:1.8.091]
在java.lang.reflect.Field.getGenericInfo(Field.java:105)~[na:1.8.091]
在java.lang.reflect.Field.getGenericType(Field.java:247)~[na:1.8.091]
在org.springframework.core.SerializableTypeWrapper$FieldTypeProvider.getType(SerializableTypeWrapper.java:285)~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE]
在org.springframework.core.SerializableTypeWrapper.forTypeProvider(SerializableTypeWrapper.java:150)~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE]
在org.springframework.core.ResolvableType.forType(ResolvableType.java:1333)~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE]
在org.springframework.core.ResolvableType.forField(ResolvableType.java:1053)~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE]
在org.springframework.core.GenericCollectionTypeResolver.getCollectionFieldType(GenericCollectionTypeResolver.java:79)~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE]
在org.springframework.data.elasticsearch.core.MappingBuilder.getFieldType(MappingBuilder.java:321)~[spring-data-elasticsearch-2.1.3.RELEASE.jar:na]
在org.springframework.data.elasticsearch.core.MappingBuilder.isEntity(MappingBuilder.java:312)~[spring-data-elasticsearch-2.1.3.RELEASE.jar:na]
在org.springframework.data.elasticsearch.core.MappingBuilder.mapEntity(MappingBuilder.java:132)~[spring-data-elasticsearch-2.1.3.RELEASE.jar:na]
在org.springframework.data.elasticsearch.core.MappingBuilder.mapEntity(MappingBuilder.java:137)~[spring-data-elasticsearch-2.1.3.RELEASE.jar:na]
在org.springframework.data.elasticsearch.core.MappingBuilder.mapEntity(MappingBuilder.java:137)~[spring-data-elasticsearch-2.1.3.RELEASE.jar:na]
在org.springframework.data.elasticsearch.core.MappingBuilder.mapEntity(MappingBuilder.java:137)~[spring-data-elasticsearch-2.1.3.RELEASE.jar:na]
在org.springframework.data.elasticsearch.core.MappingBuilder.mapEntity(MappingBuilder.java:137)~[spring-data-elasticsearch-2.1.3.RELEASE.jar:na]

有什么想法吗?

经过几天的研究,我找到了解决方案,所以我想与社区分享,也许对其他人也有用

为了避免StackOverflowXception,当Spring Data Elasticsearch尝试映射递归模式时,必须在
@Field
注释中使用
ignoreFields
属性,这样映射器就不会进入无限循环

这就是我的MailFolder类目前的样子:

...
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;
...
。。。
公共类邮件文件夹{
@字段(类型=字段类型.字符串,索引=未分析)
私有字符串id;
@字段(类型=字段类型.字符串,索引=未分析)
私有字符串名称;
@字段(类型=字段类型.字符串,索引=未分析)
私有字符串图标;
@字段(类型=FieldType.Boolean,索引=未分析)
私有布尔系统;
@字段(type=FieldType.Nested,ignoreFields={“children”})
私人名单儿童;
...

“数据模型需要递归”-ES中没有递归映射的概念,因此不要期望库支持这一点。也许我使用了错误的术语,但我希望任务是明确的:我希望存储的文档能够与