• 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格式是如下的样子: 

    {

    "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, 而不是按照约定的样式)
  • 相关阅读:
    修改Win7远程桌面端口【适用XP/2003】
    Mysql Select语句详情
    SqlServer之连接
    MySql数据类型分析(日期时间类型) Part5
    MySql数据类型分析(银行家舍入法) Part3
    MySql数据类型分析(数值(小数型)类型) Part2
    MySql数据类型分析(数值(整形)类型) Part1
    WP系统一次订阅,终身锁屏同时显示农历和天气
    c# 操作 XML(增 ,删 , 改 , 查)
    Postgresql 读取txt到DB 插入或更新
  • 原文地址:https://www.cnblogs.com/mythdoraemon/p/9939774.html
Copyright © 2020-2023  润新知