问题
最近写一个程序,有一个需求,需要在拦截器中查一下数据库或者是 redis,所以我想着把 Service 注入进去,结果报错了,注入的 service 为 null。
错误排查
- 检查 Service 是否已经注入到容器 yes
- 检查 拦截器是否已经注入到容器 yes
经过排查感觉不应该出现这个问题,最后看了一下将拦截器添加到拦截器链的代码发现了问题的所在,原本的代码如下:
@Bean
public WebMvcConfigurer webMvcConfigurer(){
return new WebMvcConfigurer(){
@Override
public void addInterceptors(@NotNull InterceptorRegistry registry) {
registry.addInterceptor(new GlobalInterceptor())
.addPathPatterns("/**");
}
};
}
问题就出在了 new GlobalInterceptor(),这是一个新的对象,并不是 ioc 容器里面的对象,所以出现了无法将 Service 注入到拦截器的问题。
解决办法就是把拦截器类上的 @Component 注解去掉,在配置@Configuration类里面使用@Bean注入拦截器,然后把上面的 new GlobalInterceptor(),替换。
代码如下:
@Configuration
public class GlobalConfig {
@Bean
@ConfigurationProperties("spring.datasource")
public DruidDataSource getDruidDataSource(){
return new DruidDataSource();
}
@Bean public GlobalInterceptor globalInterceptor(){
return new GlobalInterceptor();
}
@Bean
public WebMvcConfigurer webMvcConfigurer(){
return new WebMvcConfigurer(){
@Override
public void addInterceptors(@NotNull InterceptorRegistry registry) {
registry.addInterceptor(globalInterceptor())
.addPathPatterns("/**");
}
};
}
}