我的项目中默认是这样使用FastJsonHttpMessageConverter的:

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(
// 防止循环引用
SerializerFeature.DisableCircularReferenceDetect,
// 空集合返回[],不返回null
SerializerFeature.WriteNullListAsEmpty,
// 空字符串返回"",不返回null
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.WriteMapNullValue
);
fastJsonConfig.getSerializeConfig().put(String.class,MyStringSerializer.instance);
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
//处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON);
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
converters.add(0, fastJsonHttpMessageConverter);//放到前面 }

之前本来相安无视,后面因为springboot升级到2.6.x,原有的springfox因为很久没有更新出现兼容问题(虽然可以解决),再加上想尝试使用新的openapi3,因此换用了最近有在更新的springdoc-openapi。结果两者配合使用时,swagger界面无法加载,而v3/api-docs中的json都多出了\:

"{\"openapi\":\"3.0.1\",\"info\":{\"title\":\"OpenAPI definition\",\"version\":\"v0\"},\"servers\":[{\"url\":\"http://localhost:8099\",\"description\":\"Generated server url\"}],\"paths\":{},\"components\":{}}"

这直接导致swagger无法正确的识别,从而界面加载失败。而原来使用springfox时,并没有出现这个问题。

经过打断点分析,发现原来使用springfox时,传到com.alibaba.fastjson.serializer.SerializeConfig#getObjectWriter(java.lang.Class<?>, boolean) 这里时,class是springfox.documentation.spring.web.json.Json,fastjson对此作了特殊处理,因此可以保持原样。而改换springdoc时,此处传入的class却是String! 而fastjson默认会对String进行处理,加上转义符号,因此导致最终的结果出现异常。

解决办法:

1、换成Jackson的converter(springboot默认就是Jackson)。

2、FastJsonHttpMessageConverter:自定义一个StringSerializer,覆盖掉fastjson的默认的StringSerializer

public class MyStringSerializer implements ObjectSerializer {
public static final MyStringSerializer instance = new MyStringSerializer();
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
SerializeWriter out = serializer.getWriter();
out.write(object.toString());
}
}

然后在FastJsonHttpMessageConverter的配置文件中,如下使用

fastJsonConfig.getSerializeConfig().put(String.class,MyStringSerializer.instance);

即可覆盖掉fastjson默认的StringSerializer。(也可以通过这么操作,对其它类进行自定义处理)。

因为理解不是很透彻,不清楚fastjson为什么默认要对String进行字符转义处理,也不太清楚这样修改是否会导致其他后果,如果不妥希望能指出。

(本bug已经提交到fastjson在github上的issues中,期望能得到解答,不过这个好像只能靠分析String里的内容来solve了...)

这个bug只有FastJsonHttpMessageConverter添加到converters最前面或在默认的Jackson之前时会引起这个问题,关于converters的顺序等更深入的探讨,可以参考这篇文章:

https://segmentfault.com/a/1190000012659486

最新文章

  1. Eclipse CDT Linux下内存分析 补记
  2. (8)UI(控件)
  3. TP常用函数
  4. MyEclipse 2013 导入MyEclipse 9.0的EJB项目时,需要注意
  5. unity slua整合帅气的lua-pb解析protobuf
  6. ../../../../.. 太low了
  7. Hibernate学习---用Session实现CURD
  8. 构建web应用之——文件上传
  9. OO第二次作业总结
  10. 微信公众号授权,支付,退款总结【shoucang】
  11. JavaScript 字典
  12. 移动端FastClick和editor冲突问题。
  13. Python pandas快速入门
  14. 算法工程师A
  15. linux下使用软连接之案例二
  16. ispoweroftwo 判断2的次幂【转】
  17. kafka调试遇到的问题
  18. 区间数字的按位与 Bitwise AND of Numbers Range
  19. SICP读书笔记 2.2
  20. Java多线程之ThreadLocal总结2

热门文章

  1. 4G无线全网通太阳能水文设备电源监测系统BMS110
  2. 从零开始, 开发一个 Web Office 套件 (3): 鼠标事件
  3. Solution -「多校联训」签到题
  4. 【JOISC 2020 补题记录】
  5. Flask中本地栈的使用
  6. mysqlCRUD
  7. [LeetCode]27.移除元素(Java)
  8. 日行一算(Consecutive Integer-连续整数)
  9. 16进制转字符串得到flag
  10. 【2021新】C#数字格式化字符串