java - 多对一中的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
解决方案
您需要创建并绑定一个ObjectIdResolver
使用 autowired实现的对象EntityManager
。Jackson 对如何找到正确的实体一无所知,因为在这种情况下,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
推荐阅读
- xml - 来自 Amadeus EPower Web 服务的 500 服务器错误 - 暂存环境
- winhttp - WinHttpRequest:发送方法
- forms - Orbeon FormBuilder 嵌入
- r - 用 rbind 绑定三个数据帧
- python - Python ray get TypeError: no default __reduce__ due to non-trivial __cinit__
- python - python GET请求错误422。密钥格式无效
- scipy - 计算多块不规则图像的直方图
- react-native - 无法解析配置“:classpath”的所有工件。和错误 Received status code 403 from server: Forbidden in https://jcenter
- python - 有没有办法使用python更改excel中的部分文本颜色
- swift - .animation 修饰符在 SwiftUI 中向上移动视图