2015-11-05 54 views
0

我想知道如何使用具有雙向關係的Spring REST處理序列化。我目前正在使用Spring Boot 1.3.0.BUILD-SNAPSHOT嵌套對象上的無限遞歸Spring REST

目前,我收到併發出內部服務器錯誤,指出主類存儲庫上的GET請求有無限遞歸。

它適用於兩個類,其中之一是一個存儲庫。在本例中A爲具有存儲庫中的一個:

@Entity 
public class A implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @OneToMany(mappedBy = "a", cascade = CascadeType.ALL) 
    @JsonManagedReference 
    private List<B> b; 

    public A() { 

    } 
    public List<B> getB() { 
     return b; 
    } 
    public void setCategory(List<B> b) { 
     this.b = b; 
     for (B oneB : this.category) { 
      oneB.setA(this); 
     } 
    } 
} 

@Entity 
public class B implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @ManyToOne 
    @JoinColumn(name = "b_column") 
    @JsonBackReference 
    @RestResource(rel = "BParent") 
    private A a; 

    public B() { 

    } 
    public A getA() { 
     return a; 
    } 
    public void setA(A a) { 
     this.a = a; 
    } 
} 

但是,如果我添加了另一類是B的裏面就不管用了,我會得到無限遞歸,如果我發送一個GET請求到A的存儲庫(C有其b屬性相同的註解b):

@Entity 
public class B implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @ManyToOne 
    @JoinColumn(name = "b_column") 
    @JsonBackReference 
    @RestResource(rel = "BParent") 
    private A a; 

    @OneToMany(mappedBy = "c", cascade = CascadeType.ALL) 
    @JsonManagedReference 
    private List<C> c; 

    public B() { 

    } 
    public A getA() { 
     return a; 
    } 
    public void setA(A a) { 
     this.a = a; 
    } 
} 
從我的觀察,我可以省略C類傑克遜註釋的反向引用沒有得到任何行爲改變到b

所以。這是已知的行爲還是我錯過了什麼?

更新1

我試圖通過修改B級擺脫B和C對象之間的雙向關係,並刪除C上的後向引用:

@Entity 
public class B implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @ManyToOne 
    @JoinColumn(name = "b_column") 
    @JsonBackReference 
    @RestResource(rel = "BParent") 
    private A a; 

    //This is now a unidirectional relationship to C 
    @NotNull 
    @OneToMany 
    @JoinColumn(name="b_id", referencedColumnName="id") 
    private List<C> c; 

    public B() { 

    } 
    public A getA() { 
     return a; 
    } 
    public void setA(A a) { 
     this.a = a; 
    } 

    public List<C> getC() { 
    return c; 
    } 

    public void setC(List<C> c) { 
     this.c= c; 
    } 
} 

這枚出手無限遞歸在A的倉庫(Hooray!)上的GET請求時,它也消除了在發送POST到A倉庫(boooh!)時存儲C對象的可能性。這將拋出此錯誤消息:

org.hibernate.TransientObjectException:對象引用一個未保存的瞬態的實例 - 沖洗

更新2

之前保存的瞬態的實例我試圖添加存儲庫爲B類。這導致了另一個無限遞歸。但是這次應用程序和IDE只是因爲錯誤處理不當而崩潰。

回答

0

所以基本上,如果我定義對象B什麼樣的作品,作爲一個資源庫,並與

@RestResource(exported = false) 
@OneToMany(mappedBy = "a", cascade = CascadeType.ALL) 
@JsonManagedReference 
private List<B> b; 

批註A類的屬性如果註釋這樣對象C將得到妥善連載沒有任何無限遞歸廢話。

如果任何人有一個很好的解釋或解決方案,我會很高興地將其標記爲答案。


約彈簧安置

彈簧安置有趣的事實與具有多個連續的大寫字母變量/類名的一些問題。 例如,對於一個名爲類的倉庫

public class ACos 

將無法​​正常工作和一個名爲

private String aCos; 

將獲得序列化到

變量{ 「ACOS」: 「無論」}