$ref的产生原因

(1)重复引用:一个集合/对象中的多个元素/属性都引用了同一个对象

(2)循环引用:集合/对象中的多个元素/属性在相互引用导致循环

针对fastjson的处理

fastjson作为一款序列化引擎,不可避免的会遇到循环引用的问题,为了避免StackOverflowError异常,fastjson会对引用进行检测

局部解决法:

JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);

全局解决法:

spring项目:

<mvc:annotation-driven>  <mvc:message-converters register-defaults="true">  <bean  class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">  <property name="supportedMediaTypes">  <array>  <value>text/html;charset=UTF-8</value>  </array>  </property>  <property name="features">  <array>  <value>WriteMapNullValue</value>  <value>WriteNullStringAsEmpty</value>  <!-- 全局关闭循环引用检查,最好是不要关闭,不然有可能会StackOverflowException --><value>DisableCircularReferenceDetect</value></array>  </property>  </bean>  </mvc:message-converters>  </mvc:annotation-driven>  

springboot项目:

public class FastJsonHttpMessageConverterEx extends FastJsonHttpMessageConverter{public FastJsonHttpMessageConverterEx(){//在这里配置fastjson特性(全局设置的)FastJsonConfig fastJsonConfig = new FastJsonConfig();//fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");    //自定义时间格式//fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue);  //正常转换null值//fastJsonConfig.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);     //关闭循环引用this.setFastJsonConfig(fastJsonConfig);}@Overrideprotected boolean supports(Class<?> clazz) {return super.supports(clazz);}
}@Configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter {.....@Beanpublic FastJsonHttpMessageConverterEx fastJsonHttpMessageConverterEx(){return new FastJsonHttpMessageConverterEx();}
}

注意事项:

FastJson提供了SerializerFeature.DisableCircularReferenceDetect这个序列化选项,用来关闭引用检测。关闭引用检测后,重复引用对象时就不会被$ref代替,但是在循环引用时也会导致StackOverflowError异常。

针对于mybatis,自身默认开启一级缓存,在session范围内,参数相同的sql查询会查出同一对象,容易引发此问题

创建新的对象,把要有重复需要的对象的属性复制给新对象,新对象再添加到json那里。

转载于:https://www.cnblogs.com/it-taosir/p/10319388.html

出现$ref的原因及解决方案相关推荐

  1. 我的WCF之旅(6):在Winform Application中调用Duplex Service出现TimeoutException的原因和解决方案...

    几个星期之前写了一篇关于如何通过WCF进行 双向通信的文章([原创]我的WCF之旅(3):在WCF中实现双向通信(Bi-directional Communication) ),在文章中我提供了一个如 ...

  2. 以ajax请求方式进行文件下载操作失败的原因及解决方案

    以ajax请求方式进行文件下载操作失败的原因及解决方案 参考文章: (1)以ajax请求方式进行文件下载操作失败的原因及解决方案 (2)https://www.cnblogs.com/sjshare/ ...

  3. 自动化测试(二) 单元测试junit的Test注解突然不能使用原因以及解决方案

    自动化测试(二) 单元测试junit的Test注解突然不能使用原因以及解决方案 参考文章: (1)自动化测试(二) 单元测试junit的Test注解突然不能使用原因以及解决方案 (2)https:// ...

  4. IOS上传图片旋转90度问题出现原因及解决方案

    IOS上传图片旋转90度问题出现原因及解决方案 参考文章: (1)IOS上传图片旋转90度问题出现原因及解决方案 (2)https://www.cnblogs.com/justdoityangbo/p ...

  5. Curl 采集乱码 gzip 原因及解决方案 utf-8

    Curl 采集乱码 gzip 原因及解决方案 utf-8 参考文章: (1)Curl 采集乱码 gzip 原因及解决方案 utf-8 (2)https://www.cnblogs.com/jiaosq ...

  6. 数据倾斜的原因和解决方案

    数据倾斜的原因和解决方案 参考文章: (1)数据倾斜的原因和解决方案 (2)https://www.cnblogs.com/pengpenghuhu/p/12000199.html 备忘一下.

  7. 内存溢出和内存泄漏的区别、产生原因以及解决方案

    内存溢出和内存泄漏的区别.产生原因以及解决方案 参考文章: (1)内存溢出和内存泄漏的区别.产生原因以及解决方案 (2)https://www.cnblogs.com/ziyoublog/p/1038 ...

  8. ORA-12519, ORA-00020异常产生原因及解决方案

    ORA-12519, ORA-00020异常产生原因及解决方案 参考文章: (1)ORA-12519, ORA-00020异常产生原因及解决方案 (2)https://www.cnblogs.com/ ...

  9. 新装 Win7 系统装完驱动精灵,一打开到检测界面就卡死——原因与解决方案

    新装 Win7 系统装完驱动精灵,一打开到检测界面就卡死--原因与解决方案 参考文章: (1)新装 Win7 系统装完驱动精灵,一打开到检测界面就卡死--原因与解决方案 (2)https://www. ...

最新文章

  1. golang 警告提示 Error string should not be capitalized or end with punctuation mark
  2. jvm十一:类加载器双亲委托机制
  3. Direct2D (35) : 通过 DirectWrite 获取字体列表
  4. 开源开放 | 中国近代历史人物知识图谱
  5. 命令历史及快捷键介绍
  6. oracle 客户端连接数_查看oracle数据库允许的最大连接数和当前连接数
  7. vlc linux静态版本,vlc 在ubuntu 14下的linux版本编译
  8. ai人工智能 工业运用_人工智能在老年人健康中的应用
  9. 天涯怎么引流到qq?天涯社区如何靠发帖子引流?
  10. 如何自动化入侵海康设备
  11. vue鼠标上下滚动放大与缩小
  12. LibreOffice 宏
  13. 物体识别基本原理及其Python实现
  14. 根据贷款还款方式(等额本金,等额本息,等本等息,先息后本),计算本息
  15. windows创建文件硬连接
  16. 老树发新芽-前后端分离实践
  17. Configuring incomplete, errors occurred!
  18. 学mtml还是html5,图解核苷酸替代模型的选择 – MrMTgui 篇
  19. HP ALM使用简介
  20. windows7旗舰版主蓝色海洋 Windows7主题蓝色大海

热门文章

  1. 不相关子查询的工作方式是_课题组工作|Nucleic Acids Research|基于表达密度谱的特征子空间分离及相关单细胞转录组分群新算法...
  2. base64 二进制流java_读取和base64编码二进制文件
  3. 【音视频安卓开发 (三)】OpenGL ES 直接绘制YUV
  4. 抱歉咯!今天偷个懒!!
  5. CocosStudio的节点如何使用自定义shader
  6. 16进制数组转成10进制 qt_QT 十六进制字符串转化为十六进制编码
  7. php滚动到指定位置,JQuery插件:ScrollTo平滑滚动到页面指定位置
  8. java 实现按规则自增功能_java运算符详解 - osc_74vaali6的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. python程序设计题答案_《Python程序设计》习题与答案
  10. 西南医院微服务咋查得到_#全国最好医院排行榜#发布:成都这4家牛了!四川31个专科排全国前十(总榜)...