拦截器失效和工具类中静态变量注入失败的问题
文章目录
- 拦截器失效和工具类中静态变量注入失败的问题
- 1.拦截器配置冲突
- 2.路径配置错误
- 3.关于工具类中Maper注入失效的问题
- 解决办法1:手动赋值给静态变量
问题描述:项目中需要设置多个拦截器拦截不同路径,但是有部分拦截器失效
搜索排查后成功解决问题。
有以下几种可能:
- 多个拦截器配置实现了WebMvcConfigurer或WebMvcConfigurerSupport,冲突了
- 路径配置错误
- 没有添加
@Component
等注解,或扫描失败(这个错误我没犯,就只给大家提示一下)
1.拦截器配置冲突
这个原因的话只需要将实现了WebMvcConfigurer
的配置类整合在一起就可以。
我就犯了这个错,但是修改过后发现我的拦截器都还是没有生效
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Resource
private WebInterceptor webInterceptor;
@Resource
private SuperInterceptor superInterceptor;
@Resource
private GeneralInterceptor generalInterceptor;
@Resource
private JuniorInterceptor juniorInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(superInterceptor).addPathPatterns("/api/super/**");
registry.addInterceptor(webInterceptor)
.addPathPatterns("/**")
.excludePathPatterns(
"/web/logout",
"/web/login",
"/swagger-resources/",
"/v3/**",
"/v2/**",
"/swagger-resources/**",
"/webjars/**",
"/swagger-ui/**",
"/js/**",
"/swagger-ui.html/**",
"/doc.html",
"/error");
//以下是未生效的拦截器
registry.addInterceptor(superInterceptor).addPathPatterns("/api/super/**");
registry.addInterceptor(generalInterceptor).addPathPatterns("/api/general/**");
registry.addInterceptor(juniorInterceptor).addPathPatterns("/api/junior/**");
2.路径配置错误
这个错我也犯了,一开始打死也没想到会是这个错… …
原因:项目中配置了上下文路径,我在设置拦截器的时候将上下文路径也一起写进拦截路径里了
修改后,拦截器终于生效
//修改前
registry.addInterceptor(superInterceptor).addPathPatterns("/api/super/**");
registry.addInterceptor(generalInterceptor).addPathPatterns("/api/general/**");
registry.addInterceptor(juniorInterceptor).addPathPatterns("/api/junior/**");
//修改后
registry.addInterceptor(superInterceptor).addPathPatterns("/super/**");
registry.addInterceptor(generalInterceptor).addPathPatterns("/general/**");
registry.addInterceptor(juniorInterceptor).addPathPatterns("/junior/**");
关于拦截器的路径配置,有一点需要注意一下(否则就会和我犯一样的错):
拦截路径配置的是相对于应用程序的上下文路径的路径模式。如果你配置的拦截路径是"/super",而应用程序的上下文路径是"/api",那么实际拦截的路径将是"/api/super"。
小tips:可是使用//System.out.println(request.getServletPath());
来打印出当前的路径,对比一下和你拦截器中要拦截的是否一样。
3.关于工具类中Maper注入失效的问题
解决了以上问题后,测试后发现拦截器虽然全部生效,但是又出现了新的空指针异常。
查阅资料发现:Spring的依赖注入是依赖set方法,不支持直接将值注入到静态变量中。
解决办法1:手动赋值给静态变量
我就是采用的这个办法
原理:
- 先正常注入一个私有的Mapper,然后再声明一个静态的Mapper变量。
- 使用创建init()方法,再方法上添加
@PostConstruct
注解。被@PostConstruct
注解的方法会在Spring依赖注入后,对象使用前自动的执行,可以用来执行一些初始化的方法。- 在init方法内将正常注入的Mapper赋值给声明后未赋值的Mapper
//正常注入
@Resource
private AdminMapper adminMapperN;
//声明静态Mapper在工具类中使用
public static AdminMapper adminMapper;
//实现init方法
@PostConstruct
public void init(){
adminMapper = adminMapperN;
}
至此,我的问题全部解决!