swagger 由于fastjson 导致 打不开,解决问题思路

前言

开发突然说swagger打不开了,然后我去打开一看

image.png
说实话这个错误真的无力吐槽,swagger除了问题百分之八十都是这样的页面

解决问题思路

1.版本问题?

最近项目为了方便管理maven版本就抽离出dependencies专门管理版本,但是为了保证版本统一,部分版本是用的集团内部其他项目的版本依赖,有些同事说是不是版本导致的问题。

通过聚合的方式引入
image.png
因为项目版本之前使用的是集团的版本管理的,集团用的2.x版本的,这边因为某些原因选用的是3.0的版本,我就先去看了看,我做了版本压制(版本不一致确实也会有这个问题),排除

image.png

image.png

2.swagger 配置问题?

同事说其他项目的swagger 打得开就这个打不开,去swagger配置类看看,没啥大问题(其实3.0就不用配置@Profile(“!prod”),可以通过springfox.documentation.enabled=false就能控制)。

image.png

image.png

3.加个注解@EnableWebMvc 解决

还真的解决了,但是不能这么干,这是用bug解决bug啊,那怎么办呢?
为什么不能随便使用@EnableWebMvc?

image.png

image.png

image.png

@EnableWebMvc头上@Import(DelegatingWebMvcConfiguration.class) ,DelegatingWebMvcConfiguration的父类WebMvcConfigurationSupport 就会被注入,WebMvcAutoConfiguration 这个类就不会生效

4.为什么 加个注解@EnableWebMvc 就解决?

其他项目也没加这个注解一样没有问题,用postman请求看看

image.png
找到资源路径为/v3/api-docs

image.png
什么情况,返回的是空的

image.png
既然上面提及到@EnableWebMvc,那我们找到swagger 的controller进行debug看看,搜索/v3/api-docs 找到这个静态常量,查找引用

image.png

image.png

image.png
开始debug,发现到这里有值,更奇怪了

image.png

5.返回重新从@EnableWebMvc 找区别

看看WebMvcAutoConfiguration 里面到底做了什么,看到注入了WebMvcAutoConfigurationAdapter这个类

image.png
看看messageConvertersProvider 看看编码解码用了哪些

image.png
跟踪fastjson进行debug,找到write方法

image.png
找到writeInternal()
image.png
找到writeJSONString()看看怎么序列化的

image.png
直接到最后一行看看结果,尽然给整成{}了,具体内部怎么序列化出错的有时间再看吧,问题找到了

image.png
然后果断去看看其他项目,发现fastjson用的版本尽然不一致(因为才进行版本管理,有些项目的版本并没有替换成新的版本管理),用的是1.2.60,切换版本看看,果然解决了

image.png

6.fastjson 怎么处理swagger 兼容问题的

专门提供啊 ,具体为什么导致就swagger 的文档序列化出现问题有时间再挖吧
image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享