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

未经允许不得转载:老郭种树 » Spring boot Interceptor Autowired null 报错

赞 (0)

评论

1+6=

能将我博客放入广告拦截白名单吗?

我尽量分享有用并且长期有用的内容,希望能帮到你,谢谢支持。