2017-08-20 75 views
2

我正在開發一個restful api.I有兩個實體。用戶和用戶角色。當我請求發送到API的用戶,它給了我JSON數據不包含實體

{ 
    "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的實體,有一個用戶實體。 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

你正在使用@ JsonBackReference/@JsonManagedReference所以是的,這是預期的行爲,jsonBackReference中的邊將不會被序列化,這實際上是避免無限遞歸的必要條件,因爲傑克遜將繼續序列化它的關係的每一邊在另一邊,這就是爲什麼你需要跳過序列化的一面

有一個很好的解決方案,這一點,它在這個link提到的,我們的想法是產生於母公司實體的引用,因此,如果您序列化用戶,你將有用戶 - >角色 - > [引用用戶而不是用戶],所有你需要做的就是用@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

+0

我使用這兩個註釋遞歸。你的方法解決了這個問題。但json的結論只是引用id。有什麼不同的解決方案?我已經給數據庫ID,爲什麼我給其他ID? – zBrave

+0

@zBrave這是現在可用的解決方案,如果你想能夠序列化雙方你也可以使用DTO,這是一個不同的id,它用來引用父對象o破壞遞歸 –

+0

是的,dto可以是另一個解決方法,謝謝。 – zBrave