spring mvc 4在无限循环中返回JSON

时间:2016-02-26 08:53:55

标签: java spring spring-mvc

实体:

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。

在A类上使用@JsonBackReference注释,正常结果:

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

但是当你查询一个类时,返回的结果不是bList(使用@JsonBackference),我该怎么做才能返回bList属性?

1 个答案:

答案 0 :(得分:1)

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

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

  

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

     

•圆形装配参考会阻止静态链接,因为B取决于A但A在B完成之前无法组装。

     

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

     

•循环对象引用也使依赖注入无法进行,从而大大降低了系统的可测试性。

     

•具有大量循环引用的对象通常是God Objects。即使他们不是,他们也倾向于导致Spaghetti Code。

     

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

     

•一般来说,循环引用只是令人困惑,并且在试图理解程序如何运作时会大大增加认知负荷。