我正在开发一个安静的api。我有两个实体。用户和UserRole。当我向用户发送请求给api时,它给了我
{
"id": 11,
"name": "mert",
"username": "zbrave",
"password": "$2a$10$N0eqNiuikWCy9ETQ1rdau.XEELcyEO7kukkfoiNISk/9F7gw6eB0W",
"email": "asd",
"photo": "",
"enabled": true,
"roles": [
{
"id": 1,
"role": "ADMIN"
}
],
"online": false
}
当我发送UserRole请求时,它返回
[
{
"id": 1,
"role": "ADMIN"
}
]
但在UserRole实体中,有一个User实体。 JSON不返回用户实体。
public class UserRole implements Serializable {
...
@ManyToOne(targetEntity = User.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "user_id")
@JsonBackReference
private User user;
...
}
public class User implements Serializable {
...
@OneToMany(targetEntity = UserRole.class, mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JsonManagedReference
private List<UserRole> roles;
..
}
我可以从用户实体的json获取用户角色。但不是相反的。有什么不对的吗?谢谢你的帮助。
答案 0 :(得分:0)
你正在使用@JsonBackReference / @JsonManagedReference所以是的,这是预期的行为,jsonBackReference中的一面不会被序列化,这实际上是必要的,以避免无限递归,因为jackson将继续序列化关系的每一边从其引用另一方面,这就是你需要跳过序列化一面的原因
有一个很好的解决方案,它在这个link中提到,想法是生成对父实体的引用,所以如果你序列化用户,你将有user-&gt; role-&gt ; [引用用户而不是用户],您需要做的就是用@JsonIdentityInfo注释您的实体
@JsonIdentityInfo(generator=ObjectIdGenerators.UUIDGenerator.class, property="@id")
public class UserRole implements Serializable {
@JsonIdentityInfo(generator=ObjectIdGenerators.UUIDGenerator.class, property="@id")
public class User implements Serializable {
所以只需执行此操作并删除@ JsonBackReference / @JsonManagedReference