今天在实现login拦截器后,运行时候突然发现userMapper.fingbyId()空指针。然后自己测试了一下
@Test
public void find() {
if (userMapper==null){
System.out.println("userMapper为空");
}
userMapper.find();
}
结果居然发现自动注入mapper对象是空的
首先排除了注解错误,数据源错误的问题,后来突然想到spring容器在管理Bean自动注入时,如果是自己new创建的对象就不会自动注入。而我在使用WebMvcConfigurer类添加拦截器时候是通过new创建的
InterceptorRegistration interceptorRegistry=registry.addInterceptor(new LoginInterceptor());
这也导致了 LoginInterceptor类中对象没有自动注入
这里有两种方式解决。
方案一
if (userMapper==null){
BeanFactory factory = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
userMapper = (UserMapper) factory.getBean("userMapper");
}
spring容器不自动注入,我们就进行手动注入,获取到BeanFactory后通过getBean找到对象注入
方案二
不使用直接使用new 创建 LoginInterceptor对象,将getloginInterceptor()加上@Bean注解交给spring容器管理就可以注入对象了
@Bean
LoginInterceptor getloginInterceptor(){
return new LoginInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration interceptorRegistry=registry.addInterceptor(getloginInterceptor());
}