目录
问题1:Swagger3报错Unable to infer base url
问题2:Swagger3报错Unable to render this definition
一、问题描述
二、解决步骤
三、通用解决思路
今天整拦截器和swagger3,发现同时出了这两个问题,后面分析发现都是一个原因——拦截器拦截掉了swagger3的请求和相关资源。只想快速解决问题的小伙伴直接看第二节解决步骤就好了。
刚开始不知道是什么原因,在网上搜索了一下,发现是自己刚刚写完的jwt和拦截器(interceptor)的影响,拦截器把swagger3的请求以及其相关资源一并拦截了。
网上给出的解决思路是修改拦截器的配置,
例如这篇:Swagger3报错Unable to infer base url--拦截器问题_献_的博客-CSDN博客_swagger3 拦截器
跟着尝试了一下结果还是不行,思索一番,这才发现网上的好多都是针对swagger2的解决方案,swagger3的请求有一点点差别,摸索了好一阵子才解决,这里记录swagger3的解决过程:
直接打开拦截器配置文件,然后在 addInterceptors 方法里,.addPathPatterns("/**")的后面,增加以下语句,用于放开拦截器对swagger3的拦截:
.excludePathPatterns("/swagger-resources/**","/swagger-ui/**", "/v3/**", "/error");
注意:excludePathPatterns里需要写的是放开拦截的请求路由
这是我的拦截器配置文件代码的全貌,就这样改好了:
/**
* 拦截器的配置
*/
@Configuration
public class JwtInterceptorConfig implements WebMvcConfigurer {
@Bean(name = "authInterceptor")
public AuthInterceptor authInterceptor() {
return new AuthInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor())
// 默认拦截所有的路径
.addPathPatterns("/**")
// 不需要拦截的路由,swagger3
.excludePathPatterns("/swagger-resources/**","/swagger-ui/**", "/v3/**", "/error");
}
}
然后我们只要重启springboot项目,就可以正常访问swagger了
http://localhost:8080/swagger-ui/index.html
可能有的uu到这里还是不行(可能我的解决方法只适合我的环境?或者还有一部分swagger3的资源没有解除拦截),或许想知道解决这个问题的详细操作思路和过程,那可以再看看下面的这个通用思路,这个是我今天下午摸索出的解决过程,可能有些帮助。
想要彻底解除拦截器对swagger3的拦截,我们需要先了解swagger3有哪些资源和url。
我们打开swagger的界面网址,比如swagger3就是 http://localhost:8080/swagger-ui/index.html
按F12键调出浏览器控制台,选择查看网络(network),然后刷新页面,就会看到出来好几条请求:
我们从最后一条一条得往前面看,比如这个swagger-resources,首先点击它,选择看它的“Headers”,关注“Request URL”部分的末尾,我们可以看到它的子路由是“/swagger-resources”。
我们可以记作:"/swagger-resources/**"
"/swagger-resources/**":指的是所有携带有子路由“/swagger-resources/”的url,比如“http://localhost:8081/swagger-resources/configuration/security”也属于"/swagger-resources/**"
然后下面这个是swagger-ui,我们记作"/swagger-ui/**"
现在我们知道swagger3至少涉及两个路由了,一个是"/swagger-resources/**" ,一个"/swagger-ui/**" ,我们写到拦截器配置的excludePathPatterns里,然后重启项目。
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor())
// 默认拦截所有的路径
.addPathPatterns("/**")
// 不需要拦截的路由,swagger3
.excludePathPatterns("/swagger-resources/**","/swagger-ui/**");
}
发现出现了问题二: Unable to render this definition
这会估计就是swagger3仍然还有部分的资源又被拦截到了
那我们就重复上述步骤,继续观察network
这次,发现多了一个"/v3/**"的新路由,如下图所示
继续修改拦截器配置,换成以下的配置,就是上述三个路由:
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor())
// 默认拦截所有的路径
.addPathPatterns("/**")
// 不需要拦截的路由,swagger3
.excludePathPatterns("/swagger-resources/**","/swagger-ui/**", "/v3/**");
}
然后重启,成功啦!
---------------------------------------
作者:JSluck
日期:2022年4月14日