SpringDoc-OpenApi与Fastjson冲突——FastJsonHttpMessageConverter对String的默认处理
我的项目中默认是这样使用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
SpringDoc-OpenApi与Fastjson冲突——FastJsonHttpMessageConverter对String的默认处理的更多相关文章
- fastjson转换包含date类型属性的对象时报错com.alibaba.fastjson.JSONException: For input string: "13:02:19"
问题:time类型数据插入不进mysql数据库:调试的时候报如下错误: Caused by: java.lang.NumberFormatException: For input string: &q ...
- 将fastjson元素转化为String[]
在fastjson中如果JSONObject中添加了 String[] 类型的元素 例如 JSONObject jo = new JSONObject(); String[] array = {&qu ...
- 使用FastJSON 对Map/JSON/String 进行互转
Fastjson是一个Java语言编写的高性能功能完善的JSON库,由阿里巴巴公司团队开发的主要特性主要体现在以下几个方面: 1.高性能 fastjson采用独创的算法,将parse的速度提升到极致, ...
- com.alibaba.fastjson.JSONException: For input string: "8200-12-31"
https://www.cnblogs.com/mengjinluohua/p/5544987.html https://samebug.io/exceptions/458113/com.alibab ...
- 您好,前端使用https,后端使用https是会有冲突的情况,所以默认后端都是http 负载均衡即可管理证书,不需要在后端ECS上绑定证书。
您前端使用https,那么前端就是加密的,后端使用https就是会访问出现问题的,目前阿里云负载均衡默认的配置前端使用https,后端默认就是http,也是无法更改的. 前端使用https,目前只有一 ...
- SpringBoot更改HttpMessageConverters使用FastJson出现乱码问题
1.出现问题的现象!如下截图,使用SpringBoot 进行开发,接口返回的内容出现中文乱码? 接口内容想要返回的内容: 页面返回内容: 惊喜不?意外不? 为什么出现这个情况?不例外的话,很多同事都是 ...
- Spring Boot返回json数据及完美使用FastJson解析Json数据
Spring Boot返回json数据 视频地址:http://www.iqiyi.com/w_19rubxzsr5.html 博文参考:https://blog.csdn.net/linxingl ...
- springboot使用fastJson作为json解析框架
springboot使用fastJson作为json解析框架 springboot默认自带json解析框架,默认使用jackson,如果使用fastjson,可以按照下列方式配置使用 〇.搭建spri ...
- FastJson测试用例
基础测试 package com.ai; import com.ai.test.daily.Student; import com.alibaba.fastjson.JSON; import com. ...
随机推荐
- MySQL 快速入门(一)
目录 MySQL快速入门 简介 存储数据的演变过程 数据库分类 概念介绍 MySQL安装 MySQL命令初始 环境变量配置 MySQL环境变量配置 修改配置文件 设置新密码 忘记密码的情况 基本sql ...
- KiSystemCall64 win10 21h2函数流程分析 3环到0环
0x00基本信息 系统:windows 10 21h2 工具:ida 7.7 , windbg 10 3环写一个win32k 函数 看访问流程 0x01分析 例如:3环函数 FlattenPath(x ...
- 【JOISC 2020 补题记录】
目录 Day 1 Building 4 Hamburg Steak Sweeping Day 2 Chameleon's Love Making Friends on Joitter is Fun R ...
- MySQL架构原理之存储引擎InnoDB线程模型
如下图示,为InnoDB线程模型示意图: 1.IO Thread 在InnoDB中使用了大量的AIO(Async IO)来做读写处理,这样可以极大提高数据库的性能.其提供了write/read/ins ...
- 使用Jitpack发布开源Java库
原文:使用Jitpack发布开源Java库 | Stars-One的杂货小窝 很久之前也写过一篇使用Jitpack发布Android开源库的文章,详见Android开发--发布第三方库到JitPack ...
- 攻防世界之Web_unserialize3
题目: 直接给源码,审计代码,又是一题反序列化的.传送门:反序列化漏洞 [原理] PHP反序列化漏洞:执行unserialize()时,先会调用__wakeup(). 当序列化字符串中属性值个数大于属 ...
- [Java]Thinking in Java 练习2.12
题目 对HelloDate.java的简单注释文档的示例执行javadoc,然后通过Web浏览器查看结果. 代码 1 //: HW/Ex2_2.java 2 import java.util.*; 3 ...
- Smartbi:利用好excel分析工具,数据分析都是小case!
数据分析听起来好像很高端的样子,但是实际上在一些IT高手的眼里,只需要掌握以下几个excel数据分析小工具的使用,你也能够成为别人眼中的数据大神! 1.excel数据分析工具--条件格式 快速找出符合 ...
- Java8新特性系列-Lambda
转载自:Java8新特性系列-Lambda – 微爱博客 Lambda Expressions in Java 8 Lambda 表达式是 Java 8 最流行的特性.它们将函数式编程概念引入 Jav ...
- LINUX服务器常用命令
转至:https://my.oschina.net/7shell/blog/70508 常用命令 查看所有80端口的连接数 1. netstat -nat|grep -i "80" ...