• 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, 而不是按照约定的样式)
  • 相关阅读:
    vue-cli
    respond.js
    dataTable调用接口渲染数据,没有数据,报错
    jq自定义鼠标右键菜单
    datatables通过ajax调用渲染数据,怎么根据数据给td添加class
    【C++ Primer 第11章 练习答案】2. 关联容器概述
    【Leetcode】1. Two Sum
    【C++】拷贝构造函数(深拷贝,浅拷贝)详解
    【图的遍历】广度优先遍历(DFS)、深度优先遍历(BFS)及其应用
    【C++ Primer 第十三章】4. 拷贝控制示例
  • 原文地址:https://www.cnblogs.com/mythdoraemon/p/9939774.html
Copyright © 2020-2023  润新知