昨天在进行后台的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格式是如下的样子:
{
"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, 而不是按照约定的样式)