[英]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.