目录

问题1:Swagger3报错Unable to infer base url

问题2:Swagger3报错Unable to render this definition

一、问题描述

二、解决步骤

三、通用解决思路


问题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日

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐