2016-02-26 37 views
1

实体:弹簧MVC 4返回JSON在无限循环

class A{ 
    private int id; 
    @oneToMany(mappedBy = "a") 
    private List<B> bList; 
} 
class B{ 
    private int id; 
    @ManToOne 
    private A a; 
} 

存储库:

interfase BRepository{ 
    @Query("select b from B b where b.a.id = ?1") 
    public List<B> getB(String id); 
} 

控制器:

private BRepository b; 
@RequestMapping("/b") 
public Object getB(){ 
    return b.getB(1); 
} 

返回JSON中无限循环。

使用@JsonBackReference注解放在A级,正常结果:

class A{ 
    private int id; 
    @oneToMany(mappedBy = "a") 
    @JsonBackReference //this property is ignored 
    private List<B> bList; 
} 

但是,当你查询类,返回的结果不bList(使用@JsonBackference),我能做些什么来回报bList属性?

回答

0

我建议不要使用你的对象之间的循环引用为the following reasons

这产生了很多问题,JSON生成就是其中之一。

•循环类引用创建高耦合;每当它们中的任何一个都改变时,这两个类都必须重新编译。

•圆形装配体引用防止静态链接,因为B依赖于A,但在B完成之前A不能组装。

•循环对象引用可能会导致堆栈溢出的幼稚递归算法(例如序列化器,访问者和漂亮打印机)崩溃。更高级的算法将具有循环检测功能,并且只会失败并显示更具描述性的异常/错误消息。

•循环对象引用也使依赖注入变得不可能,从而大大降低了系统的可测试性。

•具有大量循环引用的对象通常是上帝对象。即使他们不是,他们也有导致意大利面条的倾向。

•循环实体引用(特别是在数据库中,也在域模型中)阻止使用非可空性约束,这可能最终导致数据损坏或至少不一致。

•当试图了解程序的功能时,循环引用通常会造成混淆,并大大增加认知负荷。