问题:
Spring 拦截器中无法使用 @Autowired 加载 service , 无法用 @Value 引用配置文件中的值。
解决方法:
1. 将拦截器在配置文件中以 Bean 的方式注入,不能用 new 的方式直接实例化调用。
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
public AuthInterceptor getAuthInterceptor() {
return new AuthInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// addPathPatterns()方法为需要拦截的api,excludePathPatterns()方法为不需要拦截的接口api
registry.addInterceptor(getAuthInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
注意:以 Bean 的方式注入时,不能用 static ,不然还是会出现无法调用的问题。
2. 强制将类加载到 Spring 的上下文中,loginTickerService 为需要强制加载的类。
// 解决service为null无法注入问题
if (loginTickerService == null) {
System.out.println("loginTickerService is null!!!");
BeanFactory factory = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
loginTickerService = (LoginTickerService) factory.getBean("loginTickerService");
}
原因:
拦截器的加载时间在Spring上下文之前加载,,所以需要提前将拦截器注册到Spring上下文中。