由于业务需要,需要在拦截器中操作Redis缓存,按照 controller,service层配置发现无法注入,一直报空指针异常。
@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
/**
* 将自定义拦截器作为Bean写入配置
* @return
*/
@Bean
public SysInterceptor sysInterceptor() {
return new SysInterceptor();
}
/**
* 对拦截器注册
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
String[] patterns = new String[] {"/swagger-resources/**"};
registry.addInterceptor(sysInterceptor())
.addPathPatterns("/**")
.excludePathPatterns(patterns);
super.addInterceptors(registry);
}
}
拦截器:
public class SysInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(SysInterceptor.class);
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
//业务逻辑
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
}
}
拦截器执行在Bean初始化之前导致这个问题的。在web.xml中各个元素的执行顺序是这样的,context-param-->listener-->filter-->servlet; 而拦截器是在Spring MVC中配置的,如果从整个项目中看,一个servlet请求的执行过程就变成了这样context-param-->listener-->filter-->servlet-->interceptor,为什么拦截器是在servlet执行之后,因为拦截器本身就是在servlet内部的。