JSON数据不包括实体

时间:2017-08-20 20:35:27

标签: mysql json spring hibernate rest

我正在开发一个安静的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获取用户角色。但不是相反的。有什么不对的吗?谢谢你的帮助。

1 个答案:

答案 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