2015-11-05 51 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”: “无论”}