1.通过自定义配置类(标注@Configuration注解的类)来实现WebMvcConfigurer接口,并重写addInterceptors()方法来配置拦截器。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Resource
AuthRoleInterceptor authRoleInterceptor;
/**
* /** (匹配所有路径)
*
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authRoleInterceptor)
//拦截
.addPathPatterns("/**")
//排除拦截
.excludePathPatterns("/", "/login", "/swagger-ui.html");
}
}
2.有一天心血来潮,给项目加了个swagger。导致拦截器不可用(自己的手是真的欠)
@Configuration
@EnableSwagger2
public class SwaggerConfig extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
// 解决静态资源无法访问
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/static/");
// 解决swagger无法访问
registry.addResourceHandler("/swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
// 解决swagger的js文件无法访问
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
@Bean
public Docket customDocket() {
return new Docket(DocumentationType.SWAGGER_2)
.pathMapping("/")
.select()
//扫描有Api注解的Controller
.apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
.paths(PathSelectors.any())
.build().apiInfo(this.apiInfo());
}
private ApiInfo apiInfo() {
Contact contact = new Contact("", "", "");
ApiInfoBuilder apiInfoBuilder = new ApiInfoBuilder();
return apiInfoBuilder.title("API接口")
.description("")
.version("1.0")
.termsOfServiceUrl("")
.contact(contact)
.license("")
.licenseUrl("")
.build();
}
}
3.直到我查到这边博客,才知道问题所在。当WebMvcConfigurationSupport和WebMvcConfigurer两者同时出现在项目中,能被执行的只有WebMvcConfigurationSupport,WebMvcConfigurer会被忽略
https://blog.csdn.net/qq_42809896/article/details/103930821
4.那么解决方案分为两种
a)swagger和拦截器的代码合并到一个类中(WebConfig ),删除SwaggerConfig 类,代码如下
@Configuration
@EnableSwagger2
public class WebConfig extends WebMvcConfigurationSupport {
@Resource
AuthRoleInterceptor authRoleInterceptor;
/**
* /** (匹配所有路径)
* /admin/** (匹配 /admin/ 下的所有路径)
*
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authRoleInterceptor)
//拦截
.addPathPatterns("/**")
//排除拦截
.excludePathPatterns("/", "/swagger-resources/**", "/swagger-ui.html");
}
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
// 解决静态资源无法访问
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/static/");
// 解决swagger无法访问
registry.addResourceHandler("/swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
// 解决swagger的js文件无法访问
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
@Bean
public Docket customDocket() {
return new Docket(DocumentationType.SWAGGER_2)
.pathMapping("/")
.select()
//扫描有Api注解的Controller
.apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
.paths(PathSelectors.any())
.build().apiInfo(this.apiInfo());
}
private ApiInfo apiInfo() {
Contact contact = new Contact("", "", "");
ApiInfoBuilder apiInfoBuilder = new ApiInfoBuilder();
return apiInfoBuilder.title("API接口")
.description("")
.version("1.0")
.termsOfServiceUrl("")
.contact(contact)
.license("")
.licenseUrl("")
.build();
}
}
b)SwaggerConfig 中不继承WebMvcConfigurationSupport,实现WebMvcConfigurer接口。代码如下
@Configuration
@EnableSwagger2
public class SwaggerConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 解决静态资源无法访问
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/static/");
// 解决swagger无法访问
registry.addResourceHandler("/swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
// 解决swagger的js文件无法访问
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
@Bean
public Docket customDocket() {
return new Docket(DocumentationType.SWAGGER_2)
.pathMapping("/")
.select()
//扫描有Api注解的Controller
.apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
.paths(PathSelectors.any())
.build().apiInfo(this.apiInfo());
}
private ApiInfo apiInfo() {
Contact contact = new Contact("", "", "");
ApiInfoBuilder apiInfoBuilder = new ApiInfoBuilder();
return apiInfoBuilder.title("API接口")
.description("")
.version("1.0")
.termsOfServiceUrl("")
.contact(contact)
.license("")
.licenseUrl("")
.build();
}
}