Jackson 注解

昨天在进行后台的DTO传值到前台的时候 出现了这样的问题 :java.io.IOException Json: An established connection was aborted by the software in your host machine

 经过查找Log 的时候,  发现了一串特别长的 Json 字符串 ,  发现触发了一个  infinite loop  下面是我的类的结构。

 所以 在转换的时候: 

会是如下的情况, 

A具有B的List  然后 B又具有 A的实体 ,  所以 形成了一个无限的循环。 

经过查找网上的方法, 有如下3种解决方案

第一种:@JsonManagedReference  和 @JsonBackReference

在 一方(如果是 One to one 的形式 :引用方)加入 @JsonManagedReference   在 多方(被引用方) 加入@JsonBackReference

那么 在被引用方相当于去掉了 包装 ,  即 Unwrapp了引用  对象 , 直接将整个A 对象传入进来

即如果没有加入注解的话 , json格式是如下的样子: 

扫描二维码关注公众号,回复: 4012287 查看本文章

{

"A1":"1",

"A2":"2",

"b":{

  A:(再来一次这样的循环)

  "b1":25,

  "b2":true,

  "b3":"2014-12-22 07-15-29",

  "b4":"程序员",

  "b5":"nomouse",

  "b6":"2500.00"

  }

}

但是如果加入注解的话:

{

"A1":"1",

"A2":"2",

"b":{

  b:(再来一次b的循环,不会有A的对象)

  "b1":25,

  "b2":true,

  "b3":"2014-12-22 07-15-29",

  "b4":"程序员",

  "b5":"nomouse",

  "b6":"2500.00"

  }

}

第二种方案: @JsonIdentityInfo  给每个实体类 附上特殊的ID值, 这样子如果发现是一样的对象,只返回一个引用值, 而不会返回对象, 这个方案 我没有使用

第三种方案:使用@JsonIgnore  这个的意思是  直接让多方放弃对一方的引用, 也就是说  只有可能一方查找到多方的值 ,但是多方找不到一方的值 。

所以 我是 第一种方案 和第二种方案 同时使用的  

还有一点  如果再一个类中多次使用backReference 和  ManagedReference  可能会报Jackson: Multiple back-reference properties with name 'defaultReference'  意思是有多个相互引用 , 所以我们需要给引用附上值

@JsonManagedReference("name1")
@JsonBackReference("name1")

这样子Json字符串就知道了 , 是哪一个属性之间的的依赖 (同时 这个属性也有 JsonProperties 的作用 , 会将你的json 格式转换成name, 而不是按照约定的样式)

猜你喜欢

转载自www.cnblogs.com/mythdoraemon/p/9939774.html