首页 > 解决方案 > 多对一中的Spring未解决的前向引用

问题描述

我有一个任务和一个用户实体,具有一对多的关系。所以在英语中一个用户可以有多个任务,一个任务属于一个用户

public class User {
    @Id
    private Long id;

    @OneToMany(mappedBy="task")
    private Set<Task> tasks;
}
public class Task {
    @Id
    private Long id;

    @ManyToOne
    @JoinColumn(name="user_id", nullable=false)
    @JsonIdentityInfo(generator= ObjectIdGenerators.PropertyGenerator.class, property="id")
    @JsonIdentityReference(alwaysAsId=true)
    @JsonProperty("user_id")
    private User user;
    private String name;
}

当我尝试发布任务时

{
  "name": "Test task",
  "user_id": 1
}

我得到以下信息:

Unresolved forward references for: ; nested exception is com.fasterxml.jackson.databind.deser.UnresolvedForwardReference

编辑: 按照这篇文章并实施 EntityIdResolver 在此错误中返回:

 Unable to locate persister: java.lang.Object; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Unable to locate persister

标签: javaspringhibernatespring-bootjackson

解决方案


您需要创建并绑定一个ObjectIdResolver使用 autowired实现的对象EntityManagerJackson 对如何找到正确的实体一无所知,因为在这种情况下,ORM 实现和反序列化库之间没有关系。

这个解析器本身是:

用于从对象标识符解析实际 Java 对象的 API 定义(使用 JsonIdentityInfo 进行注释)。

关键方法是ObjectIdResolver::resolveId使用以下方法获取要通过其 ID 匹配的项目:

示例代码:

@Override
public Object resolveId(final ObjectIdGenerator.IdKey id) {
    return entityManager.find(id.scope, id.key);
}

解析器应与以下一起使用@JsonIdentityInfo

@JsonIdentityInfo(
    generator= ObjectIdGenerators.PropertyGenerator.class, 
    property="id", 
    resolver = CustomIdResolver.class)
...
private User user;

这个问题也可能有帮助:JsonIdentityInfo Resolver instantiated in Spring Context


推荐阅读