Spring boot Interceptor Autowired null 报错

写在前面

终于可以总结下。使用 Spring boot 过程中踩了很多坑,其中如题。需要在拦截器中使用注解 @Autowired自动装配某个对象。结果报 null 。查了一番才了解到,在 spring boot 中使用拦截器还有陷阱。

Autowired返回null

public class MyInterceptor implements HandlerInterceptor {

    private static final Logger logger = LoggerFactory.getLogger(MyInterceptor.class);
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
 }
@Configuration
public class MyInterceptorConfig extends WebMvcConfigurationSupport {

    @Bean
    public MyInterceptor getMyInterceptor(){
        return new MyInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 实现 WebMvcConfigurer 不会导致静态资源被拦截
        registry.addInterceptor(new MyInterceptor())
                // 拦截所有 URL
                .addPathPatterns("/**")
        super.addInterceptors(registry);
    }
}

如果使用 Spring boot 相信都懂啥意思。在如上情况下报错了。

修改 MyInterceptorConfig

拦截器 MyInterceptor 代码不用动,直接修改 MyInterceptorConfig中代码即可。改成如下。

@Configuration
public class MyInterceptorConfig extends WebMvcConfigurationSupport {

    @Bean
    public MyInterceptor getMyInterceptor(){
        return new MyInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 实现 WebMvcConfigurer 不会导致静态资源被拦截
        registry.addInterceptor(getMyInterceptor())
                // 拦截所有 URL
                .addPathPatterns("/**")
        super.addInterceptors(registry);
    }
}

找了一些资料也没看出来是什么原因,但是从修改代码的内容来看。前面那种办法在拦截器拦截生效时,Spring 容器中还没获取到需要装配的对象实例。所以现在修改成在拦截器拦截生效时,提前将实例通过注解的方式放到 spring 容器中。

Thx

https://stackoverflow.com/questions/31578982/autowired-in-custominterceptor-getting-nullspring-boot

本文由老郭种树原创,转载请注明:https://guozh.net/spring-boot-interceptor-autowired-null-baocuo/

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注