zoukankan      html  css  js  c++  java
  • Could not write JSON: Infinite recursion (StackOverflowError);

    转自:https://blog.csdn.net/east123321/article/details/80435051
    在controller返回数据到统一json转换的时候,出现了json infinite recursion stackoverflowerror的错误,即json在将对象转换为json格式的数据的时候,出现了无限递归调用的情况。

    具体的情况如下:

    A类中,有个属性:List<B> b, A与B的关系为 OneToMany;在B类中,有属性A a,引用到A中的字段id,并作为外键。hibernate查询结果正常,可以看到返回的A对象中,有b参数值,但在json转换的时候就出现了无限递归的情况。个人分析,应该是json在序列化A中的b属性的时候,找到了B类,然后序列化B类,而B类中有a属性,因此,为了序列化a属性,json又得去序列化A类,如此递归反复,造成该问题。

    解决方法:

    在B类中a的getter setter方法上加注解@JsonBackReference ,在getter上加即可解决

    @JsonBackReference和@JsonManagedReference:这两个标注通常配对使用,通常用在父子关系中。@JsonBackReference标注的属性在序列化(serialization,即将对象转换为json数据)时,会被忽略(即结果中的json数据不包含该属性的内容)。@JsonManagedReference标注的属性则会被序列化。在序列化时,@JsonBackReference的作用相当于@JsonIgnore,此时可以没有@JsonManagedReference。但在反序列化(deserialization,即json数据转换为对象)时,如果没有@JsonManagedReference,则不会自动注入@JsonBackReference标注的属性(被忽略的父或子);如果有@JsonManagedReference,则会自动注入自动注入@JsonBackReference标注的属性。  

    @JsonIgnore:直接忽略某个属性,以断开无限递归,序列化或反序列化均忽略。当然如果标注在get、set方法中,则可以分开控制,序列化对应的是get方法,反序列化对应的是set方法。在父子关系中,当反序列化时,@JsonIgnore不会自动注入被忽略的属性值(父或子),这是它跟@JsonBackReference和@JsonManagedReference最大的区别。

  • 相关阅读:
    LootCode-链表排序-Java
    Vue创建项目及基本语法 一
    七大设计原则、单一职责原则
    SpringBoot 将自制的Starter 发布到远程公服
    SpringBoot 系列
    Mysql Sql 语句练习题 (50道)
    一、SpringBoot学习笔记_Eclipse 安装 SpringBoot、配置Gradle
    七、垃圾回收_判断对象是否存活算法_可达性分析法详解
    从零开始搭建Django+vue前后端分离项目
    Airtest一:批量运行脚本、汇总报告、导出报告
  • 原文地址:https://www.cnblogs.com/Mr-Kenson/p/9086917.html
Copyright © 2011-2022 走看看