我有一个完美运行Spring Data MongoDB 1.4.2的项目。我尝试更新到1.5.0并在自动装配(提取)期间出现此错误:
引起:org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexResolver $ CyclicPropertyReferenceException:找到路径'filter.rules'类型'Filter'中字段'rules'的循环 在org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexResolver $ CycleGuard.protect(MongoPersistentEntityIndexResolver.java:370)〜[spring-data-mongodb-1.5.0.RELEASE.jar:na] 在org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexResolver $ 2.doWithPersistentProperty(MongoPersistentEntityIndexResolver.java:144)〜[spring-data-mongodb-1.5.0.RELEASE.jar:na] 在org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexResolver $ 2.doWithPersistentProperty(MongoPersistentEntityIndexResolver.java:138)~ [spring-data-mongodb-1.5.0.RELEASE.jar:na] 在org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:294)〜[spring-data-commons-1.8.0.RELEASE.jar:na]
我有一个存储库“RulesDAO”只是扩展“MongoRepository”。它管理名为“Rule”的实体。该实体具有一些基本字段和“过滤器”字段。此Filter类包含Filter列表(可以为空)。
@Document(collection="rules")
public class Rule {
@Id private String id;
private String name;
// other fields
private Filter filter;
}
public class Filter {
// for groups
private String condition;
private List<Filter> rules = new ArrayList<Filter>();
// for query
private String field;
private String value;
}
(“规则”不是一个完美的名称,但它必须以这种方式命名为MVC绑定)
所以Filter.rules属性被解释为一个循环,它不是! (以及我对术语“循环”的理解)
它是发布中的错误还是这个用例有一个新的“标志”?
谢谢
对于背景故事,Filter类可以是叶子或用于构建复杂Criteria的树的节点,它是从mines http://mistic100.github.io/jQuery-QueryBuilder的jQuery插件的JSON构建的。
你的代码是正确的。该日志消息只是INFO
级别,告诉您代码中存在潜在的循环引用。
您可以通过关闭记录器来忽略该恼人的消息。如果您使用的是Spring Boot,请将其添加到application.properties
文件:
logging.level.org.springframework.data.mongodb.core.index=OFF
给定类型包含一个strcuture,可能会在尝试解析索引信息和/或从存储中读取值时导致无限循环。在启动期间,将检查域类型以及集合的泛型类型信息。这指出了产生的错误中提到的循环。
Rule -> Filter -> Filter.rules
^ |
| |
+----------------+
虽然错误不应该阻止容器启动 - 只应打印到日志中。也许你会额外遇到DATAMONGO-949,并希望给当前的1.5.1-SNAPSHOT一个旋转。
请随意到open a ticket。
您正在使用:private List <Filter> rules = new ArrayList <Filter>();
将此更改为:private List <?> child;
我遇到了同样的问题,但在使用它之后,代码工作正常,没有错误。