拦截器失效和工具类中静态变量注入失败的问题

拦截器失效和工具类中静态变量注入失败的问题

文章目录

  • 拦截器失效和工具类中静态变量注入失败的问题
    • 1.拦截器配置冲突
    • 2.路径配置错误
    • 3.关于工具类中Maper注入失效的问题
      • 解决办法1:手动赋值给静态变量

问题描述:项目中需要设置多个拦截器拦截不同路径,但是有部分拦截器失效

搜索排查后成功解决问题。

有以下几种可能:

  1. 多个拦截器配置实现了WebMvcConfigurer或WebMvcConfigurerSupport,冲突了
  2. 路径配置错误
  3. 没有添加@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.路径配置错误

这个错我也犯了,一开始打死也没想到会是这个错… …

原因:项目中配置了上下文路径,我在设置拦截器的时候将上下文路径也一起写进拦截路径里了

拦截器失效和工具类中静态变量注入失败的问题_第1张图片

修改后,拦截器终于生效

//修改前
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注入失效的问题

解决了以上问题后,测试后发现拦截器虽然全部生效,但是又出现了新的空指针异常。

拦截器失效和工具类中静态变量注入失败的问题_第2张图片

查阅资料发现:Spring的依赖注入是依赖set方法,不支持直接将值注入到静态变量中

解决办法1:手动赋值给静态变量

我就是采用的这个办法

原理:

  1. 先正常注入一个私有的Mapper,然后再声明一个静态的Mapper变量。
  2. 使用创建init()方法,再方法上添加@PostConstruct注解。@PostConstruct注解的方法会在Spring依赖注入后,对象使用前自动的执行,可以用来执行一些初始化的方法。
  3. 在init方法内将正常注入的Mapper赋值给声明后未赋值的Mapper
//正常注入
@Resource
private AdminMapper adminMapperN;

//声明静态Mapper在工具类中使用
public static AdminMapper adminMapper;

//实现init方法
@PostConstruct
public void init(){
    adminMapper = adminMapperN;
}

至此,我的问题全部解决!

你可能感兴趣的:(项目残废日志,spring,后端,java,拦截器,报错)