2013-01-10 134 views
1

我已經被轉換成JSON在我的彈簧安置控制器的方法以下Java JPA對象,他們是傑克遜深嵌套對象

class User{ 
    @JsonManagedReference 
    @OneToMany 
    private Portfolio portfolio; 
    ..... 
} 

class Portfolio { 
    @JsonBackReference 
    @ManyToOne 
private User user; 

    @JsonManagedReference 
    private List<Order> orders; 
    ..... 
} 

class Order { 
    @JsonBackReference 
private Portfolio portfolio; 

    private User user; 
} 

在我的應用程序需要2個服務:

  1. 登錄: 返回User對象,使用Portfolio和List of Orders對象,我不需要Order.user對象。

  2. GetOrders: 返回一個訂單清單,我需要Order.user對象。

Order.user是不一樣的父用戶對象。

我的問題是如何避免用戶對象的無限遞歸問題?或者這只是一個糟糕的設計?

回答

2

@JsonManagedReference@JsonBackReference的問題是,它們處理非常特定類型的(直接)循環引用很好,但不是設計來處理窄窗(其中單個父對象,直接關係到一個或以外的任何東西更多的子對象)。不幸的是,你的用例不屬於這個窗口。

所以,你有兩個選擇:

  • 手動解決方法 - 在服務類,你將需要刪除(使無效)的order.user屬性,序列化的頂級user對象之前。相反,在序列化orders之前,您需要刪除(使空)user.portfolio.orders屬性。

  • Framework解決方法 - 升級到Jackson 2.0+並使用@JsonIdentityInfo。它可以正確處理圖形中的對象引用,多對多關係,深度對象樹等等。 Some documentation and examples

可以也避開這個問題,如果你有過ObjectMapper控制。如果你這樣做,那麼你只需要指定一個自定義的序列化器來使用,這取決於你要返回哪個對象,但是由於你在Spring框架內工作,我不相信你可以直接控制這個映射器。

我個人的建議是升級你的傑克遜圖書館並使用@JsonIdentityInfo

+0

好的答案,似乎有些學習與傑克遜,謝謝 – macalase