写在前面
终于可以总结下。使用 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/