出现$ref的解决原因
Posted it-taosir
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了出现$ref的解决原因相关的知识,希望对你有一定的参考价值。
$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); } @Override protected boolean supports(Class<?> clazz) { return super.supports(clazz); } } @Configuration public class WebMvcConfigurer extends WebMvcConfigurerAdapter { ..... @Bean public FastJsonHttpMessageConverterEx fastJsonHttpMessageConverterEx(){ return new FastJsonHttpMessageConverterEx(); } }
注意事项:
FastJson提供了SerializerFeature.DisableCircularReferenceDetect这个序列化选项,用来关闭引用检测。关闭引用检测后,重复引用对象时就不会被$ref代替,但是在循环引用时也会导致StackOverflowError异常。
针对于mybatis,自身默认开启一级缓存,在session范围内,参数相同的sql查询会查出同一对象,容易引发此问题
创建新的对象,把要有重复需要的对象的属性复制给新对象,新对象再添加到json那里。
以上是关于出现$ref的解决原因的主要内容,如果未能解决你的问题,请参考以下文章
git项目初次push提示error: failed to push some refs to https://gitee.com/xxxx/gittest.git’解决方案 --九五小庞(代码片段
[未解决问题记录]python asyncio+aiohttp出现Exception ignored:RuntimeError('Event loop is closed')(代码片段