前言
开发突然说swagger打不开了,然后我去打开一看
说实话这个错误真的无力吐槽,swagger除了问题百分之八十都是这样的页面
解决问题思路
1.版本问题?
最近项目为了方便管理maven版本就抽离出dependencies专门管理版本,但是为了保证版本统一,部分版本是用的集团内部其他项目的版本依赖,有些同事说是不是版本导致的问题。
通过聚合的方式引入
因为项目版本之前使用的是集团的版本管理的,集团用的2.x版本的,这边因为某些原因选用的是3.0的版本,我就先去看了看,我做了版本压制(版本不一致确实也会有这个问题),排除
2.swagger 配置问题?
同事说其他项目的swagger 打得开就这个打不开,去swagger配置类看看,没啥大问题(其实3.0就不用配置@Profile(“!prod”),可以通过springfox.documentation.enabled=false就能控制)。
3.加个注解@EnableWebMvc 解决
还真的解决了,但是不能这么干,这是用bug解决bug啊,那怎么办呢?
为什么不能随便使用@EnableWebMvc?
@EnableWebMvc头上@Import(DelegatingWebMvcConfiguration.class) ,DelegatingWebMvcConfiguration的父类WebMvcConfigurationSupport 就会被注入,WebMvcAutoConfiguration 这个类就不会生效
4.为什么 加个注解@EnableWebMvc 就解决?
其他项目也没加这个注解一样没有问题,用postman请求看看
找到资源路径为/v3/api-docs
什么情况,返回的是空的
既然上面提及到@EnableWebMvc,那我们找到swagger 的controller进行debug看看,搜索/v3/api-docs 找到这个静态常量,查找引用
开始debug,发现到这里有值,更奇怪了
5.返回重新从@EnableWebMvc 找区别
看看WebMvcAutoConfiguration 里面到底做了什么,看到注入了WebMvcAutoConfigurationAdapter这个类
看看messageConvertersProvider 看看编码解码用了哪些
跟踪fastjson进行debug,找到write方法
找到writeInternal()
找到writeJSONString()看看怎么序列化的
直接到最后一行看看结果,尽然给整成{}了,具体内部怎么序列化出错的有时间再看吧,问题找到了
然后果断去看看其他项目,发现fastjson用的版本尽然不一致(因为才进行版本管理,有些项目的版本并没有替换成新的版本管理),用的是1.2.60,切换版本看看,果然解决了
6.fastjson 怎么处理swagger 兼容问题的
专门提供啊 ,具体为什么导致就swagger 的文档序列化出现问题有时间再挖吧