繁体   English   中英

Neo4j Spring Data 映射到 Java API stackoverflow

[英]Neo4j Spring Data mapping to Java API stackoverflow

当我尝试将数据从 neo4j 映射到 Spring 数据时出现 StackOverflowError 错误。 该项目正在使用 Lombok。

我只能使用一次就获得 Project,效果很好。 但是对于一个有两次以上使用的项目,就会出现这个错误。

任何人都可以帮忙吗? 谢谢。

错误:

Resolved exception caused by Handler execution: org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.StackOverflowError

项目.java

@NodeEntity
@Data
//@JsonIgnoreProperties({"project","use"}) //also tried but same issue
public class Project {
    @Id
    private String id;

    @Nullable
    private String name;

    @JsonIgnoreProperties({"project","use"})
    @Relationship(type = "USED_FOR")
    List<ProjectUseRelation> usedFor = new ArrayList<>();
}

使用.java

@NodeEntity
@Data
//@JsonIgnoreProperties({"project","use"}) //also tried but same issue
public class Use {
    @Id
    private String id;

    @Nullable
    private String name;

    @JsonIgnoreProperties({"project","use"})
    @Relationship(type = "USED_FOR", direction = Relationship.INCOMING)
    List<ProjectUseRelation> usedByProjects = new ArrayList<>();
}

项目使用关系.java

@RelationshipEntity(type = "USED_FOR")
@Data
public class ProjectUseRelation {
    @Id
    private Long id;

    @Nullable
    private String name;

    @StartNode
    @JsonIgnoreProperties({"usedFor"})
    private Project project;

    @EndNode
    @JsonIgnoreProperties({"usedByProjects"})
    private Use use;
}

服务.java

@Service
@AllArgsConstructor
public class Service{
private final Repository repository;
@Transactional(readOnly = true)
public Map<String, Object> graph(String id){
    //system correctly reached here
    Collection<Project> result = repository.graph(id);
    //system can't reach here
    return result;
    }
}

存储库.java

public interface Repository extends Neo4jRepository<Project,String>{
    @Query("MATCH map = (p:Project)-[]-(u:Use) WHERE p.id = {id} RETURN map")
    Collection<Project> graph(@Param("id") String id);
}

这现在可以返回单个/多个一对一关系,但不能返回单个一对多关系。

如果您需要将数据序列化为 JSON,并且您的实体具有循环依赖关系(例如,实体 X 有一个引用 Y 的字段,而 Y 有一个引用 X 的字段),那么您必须使用注解@JsonIgnoreProperties@JsonIgnore ,在适当的情况下,在序列化期间避免StackOverflowError

有关更多详细信息,请参阅文档

[更新]

您的Project实体会忽略ProjectUseRelation.project字段(在序列化期间),但不会忽略ProjectUseRelation.use

并且Use实体忽略ProjectUseRelation.use但不忽略ProjectUseRelation.project

因此,循环依赖仍然存在:

   Project.userFor
     -> ProjectUseRelation.use
     -> Use.usedByProjects
     -> ProjectUseRelation.project
     -> Project

所以,我发现问题出在 Lombok @Data 注释上。 如果我注释掉@Data 注释并编写自己的getter 和setter,则不会出现堆栈溢出错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM