之前项目是部署在服务器上,运行java包没有任何问题,打war包部署在本地tomcat看log文件过滤器filter有个空指针报错
原因应该是:拦截器(过滤器)加载是在springcontext创建之前完成的,所以在拦截器(过滤器)中注入实体自然就为null
问题复现:
@Component
@Data
@ConfigurationProperties(prefix="spring.redis")
public class RedisConfig {
private String host;
private Integer port;
private String password;
}
过滤器中..
@Autowired
private RedisConfig redisConfig;
redisConfig.getHost() // 这里报了一个空指针,说明 @Autowired 失效了
解决方法:使用WebApplicationContext 上下文对象来手动注入
/**
* 由于在过滤器中无法直接通过Autowired获取Bean,因此需要通过spring上下文来获取IOC管理的实体类
*/
public <T> T getBean(Class<T> clazz, HttpServletRequest request){
WebApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
return applicationContext.getBean(clazz);
}
RedisConfig redisConfig = getBean(RedisConfig.class, req); //使用的地方调用
redisConfig.getHost() // 再取值就没有问题了