【问题标题】:SDN 4 - MappingException: Infinite recursion (StackOverflowError)SDN 4 - MappingException:无限递归(StackOverflowError)
【发布时间】:2015-07-05 16:27:30
【问题描述】:

我在执行存储库查询时遇到 org.neo4j.ogm.metadata.MappingException: Infinite recursion (StackOverflowError)。该项目是从 SDN 3 移植过来的。

示例域模型:

@NodeEntity
public class Person {
    ...
    @Relationship(type = "FRIENDSHIP")
    private Set<Friendship> friendships = new HashSet<Friendship>();
    ...
}

@RelationshipEntity
public class Friendship {
    ...
    @StartNode private Person person1;
    @EndNode private Person person2;
    Date since;
    ...
}

运行以下查询时抛出异常:

@Query("MATCH (person1 {id: {0}.id})-[rel:FRIENDSHIP]->(person2 {id: {1}.id}) "
        + "return rel")
Friendship getFriendship(Person person1, Person person2);

例外:

org.neo4j.ogm.metadata.MappingException: Infinite recursion (StackOverflowError) (through reference chain: com.example.domain.Friendship["person1StartNode"]->com.example.domain.Person["friendships"]->java.util.HashSet[0]->com.example.domain.Friendship["niperson1StartNode"]->com.example.domain.Person["friendships"]......

我认为这可能与 @StartNode 和 @EndNode 是同一类型有关。但是当@EndNode 是其他类型时,我得到了同样的例外。

使用快照。

【问题讨论】:

    标签: neo4j spring-data-neo4j spring-data-neo4j-4


    【解决方案1】:

    我遇到了同样的错误,但经过一些调查后,我注意到这是由于 Jackson 将模型对象序列化为 JSON,进入了无限递归。

    解决方案是在导致问题的成员上添加@JsonIgnore,或者只是从模型中填充 DTO 并在 API 层中返回它。

    我选择了第一个选项,因为我正在开发一个原型并且需要快速迭代,但是带有一些 BeanUtils 魔法的第二个选项可能会避免这种 JsonIgnore 的东西。

    【讨论】:

      【解决方案2】:

      您能否将查询更改为

      @Query("MATCH (person1 {id: {0}})-[rel:FRIENDSHIP]->(person2 {id: {1}}) "
              + "return rel")
      Friendship getFriendship(long person1, long person2);
      

      (或id的正确数据类型)

      不支持本身为实体的参数。

      话虽如此,但该异常根本没有帮助。已开通https://jira.spring.io/browse/DATAGRAPH-694

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-03
        • 2020-02-12
        • 2016-09-29
        • 2012-10-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多