最近使用 Spring Boot 的自定义拦截器,在拦截器中注入了一个DAO,准备下面作相应操作,拦截器代码:
public class TokenInterceptor implements HandlerInterceptor {
@Autowired
private ITokenDao tokenDao;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
}
...
}
配置信息代码:
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {
/**
*
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TokenInterceptor())
.excludePathPatterns("/user/login");
super.addInterceptors(registry);
}
}
看似没有问题,但运行结果发现Token拦截器中注入的DAO为null。
问题原因:
造成null的原因是因为拦截器加载是在Spring Context创建之前完成的,所以在拦截器中注入实体自然就为null。
解决方案:
解决方法就是让Bean提前加载,将配置信息修改为如下:
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {
@Bean
public HandlerInterceptor getTokenInterceptor(){
return new TokenInterceptor();
}
/**
*
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getTokenInterceptor())
.excludePathPatterns("/user/login");
super.addInterceptors(registry);
}
}
重新运行,注入DAO成功。
参考:
- 关于springboot拦截器里使用@Autowired注入失败为空的问题
- springboot拦截器无法用@Autowired自动注入bean(利用构造注入来给拦截器中的navService注入bean)
- springboot 拦截器@Autowired 注入失败