该问题已解决!特此记录!欢迎指点分享!
目录
(1)继承 mvc的配置类 WebMvcConfigurationSupport
一 · 问题发生背景:
公司 Springboot1.5 - 升级 Springboot 2.7
对拦截器不太明白时候,可以参考以下博文:
Springboot 拦截器(Interceptor)详解_、楽.的博客-CSDN博客_interceptor springboot
Spring Boot拦截器(Interceptor)详解_时间漏斗的博客-CSDN博客_interceptor order
二 · 框架版本:
Springboot 2.7
Swagger 2.9.0
· 问题复现
项目 启动报错(如图):
org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException
三 · 解决方案(着急可略过1 直接看 2 )
1、网上大概有 几种:
(1)swagger版本问题,升级3.0版本 (亲测对我项目无用)
(2)拦截器自定义各种写法,各种路径放开 (个人感觉 越看越迷)
(3)properties文件 的更改 (亲测对我项目无用)
2、我的方案 ,摒弃杂念从根本入手
Springboot1.5 继承 WebMvcConfigurerAdapter的写法,Springboot2.7版本升级已经不支持了,如图:
经查找资料理清有两种方式可实现自定义拦截器:
(1)继承 mvc的配置类 WebMvcConfigurationSupport
a、springboot2.0以后,mvc配置类从 WebMvcConfigurerAdapter 变成了 WebMvcConfigurationSupport,因此写法如下:
b、 需格外注意的是,在springboot2.0.0之后继承WebMvcConfigurationSupport类,要重写addInterceptors 和 addResourceHandlers 方法,以及 配置好静态资源路径 ,尤其是swagger-ui.html,不然会导致404,当然也不要忘记根据需要写跨域方法:
c、跨域 的 allowedOriguns("*") 也 变成了 allowedOriginPatterns("*"):
至此,项目正常启动,一切正常了,第一种方法结束;
(2)实现 WebMvcConfigurer 接口
a、实现 WebMvcConfigurer接口,一定要加上@EnableWebMvc 注解,告诉spring 我要完全自己控制mvc配置,也就是说所有配置自己重写,所有默认配置都没了;有博主说到这样写,有时会导致很多请求进不来,或者参数转换出错之类的,因为spring mvc默认的转换器已经不生效了,包括全局配置的Jackson也会失效;也不排除这种可能。
当然,目前我没有遇到,因为我重写的方法路径该放开的放开,该拦截的拦截了。
如果此处不加@EnableWebMvc 注解会报 文章开始的错误,导致项目运行不起来!!
b、加好@EnableWebMvc注解后,也不再需要 重写的方法了,因为会报红报错,所以注释或删掉 super.addInterceptors(registry); 、super.addResourceHandlers(registry); 并且同样要写好放开静态资源路径的代码,如图:
至此,方法二启动成功,项目一切正常了。
四 · 完整代码
继承 mvc的配置类 WebMvcConfigurationSupport 的完整代码:
package cn.cinfotech.common.config;
import cn.cinfotech.filter.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
import javax.annotation.Resource;
/**
* @author fantong
* Springmvc 拦截器注册
*/
@Configuration
//@EnableWebMvc
//public class InterceptorConfig extends WebMvcConfigurerAdapter {
public class InterceptorConfig extends WebMvcConfigurationSupport {
//public class InterceptorConfig implements WebMvcConfigurer {
// @Autowired
@Resource
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册拦截器
// registry.addInterceptor(new AuthorizationInterceptor()).excludePathPatterns("/**");
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/user/XXXXXX/XXXXXX","/XXXXXX/XXXXXX","/user/XXXXXX/XXXXXX","/XXXXXX/v2/alipay_callback", "/XXXXXX/iosPay","/error","/XXXXXX/v2/wxCallBack","/XXXXXX/v2/XXXXXX","/swagger-resources/**","/webjars/**","/static/**","/swagger-ui.html/**");//"/qrcode/v2/pc/inquireLoginState",
// .excludePathPatterns(String.valueOf(excludePath));
//在springboot2.0.0之后继承WebMvcConfigurationSupport类,重写addInterceptors方法
// *
super.addInterceptors(registry);
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/static/")
.addResourceLocations("classpath:/resources/");
registry.addResourceHandler("/templates/**").addResourceLocations("classpath:/templates/");
registry.addResourceHandler("swagger-ui.html","doc.html").addResourceLocations("classpath:/META-INF/resources/");
//Windows下
registry.addResourceHandler("/uploads2/**").addResourceLocations("file:D:/springbootFile/upload/images/");
//Mac或Linux下(没有CDEF盘符)
registry.addResourceHandler("/uploads/**").addResourceLocations("file:/home/qmake/workspace/images/userImg/");
super.addResourceHandlers(registry);
}
/**
* 跨域支持
* @author QianChi
* @date 2021/6/30 9:55
*
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
// .allowedOrigins("*")
.allowedOriginPatterns("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH", "OPTIONS", "HEAD")
.maxAge(3600 * 24);
}
}
实现WebMvcConfigurer 接口的完成拦截器 代码:
package cn.cinfotech.common.config;
import cn.cinfotech.filter.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
import javax.annotation.Resource;
/**
* @author fantong
* Springmvc 拦截器注册
*/
@Configuration
@EnableWebMvc
//public class InterceptorConfig extends WebMvcConfigurerAdapter {
//public class InterceptorConfig extends WebMvcConfigurationSupport {
public class InterceptorConfig implements WebMvcConfigurer {
// @Autowired
@Resource
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册拦截器
// registry.addInterceptor(new AuthorizationInterceptor()).excludePathPatterns("/**");
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/user/XXXXXX/XXXXXX","/XXXXXX/XXXXXX","/user/XXXXXX/XXXXXX","/XXXXXX/v2/alipay_callback", "/XXXXXX/iosPay","/error","/XXXXXX/v2/wxCallBack","/XXXXXX/v2/XXXXXX","/swagger-resources/**","/webjars/**","/static/**","/swagger-ui.html/**");//"/qrcode/v2/pc/inquireLoginState",
// .excludePathPatterns(String.valueOf(excludePath));
//在springboot2.0.0之后继承WebMvcConfigurationSupport类,重写addInterceptors方法
// *
// super.addInterceptors(registry);
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/static/")
.addResourceLocations("classpath:/resources/");
registry.addResourceHandler("/templates/**").addResourceLocations("classpath:/templates/");
registry.addResourceHandler("swagger-ui.html","doc.html").addResourceLocations("classpath:/META-INF/resources/");
//Windows下
registry.addResourceHandler("/uploads2/**").addResourceLocations("file:D:/springbootFile/upload/images/");
//Mac或Linux下(没有CDEF盘符)
registry.addResourceHandler("/uploads/**").addResourceLocations("file:/home/qmake/workspace/images/userImg/");
// super.addResourceHandlers(registry);
}
/**
* 跨域支持
* @author QianChi
* @date 2021/6/30 9:55
*
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
// .allowedOrigins("*")
.allowedOriginPatterns("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH", "OPTIONS", "HEAD")
.maxAge(3600 * 24);
}
}
特此记录,踩坑日志
转载请注明出处: