@Autowired无法注入,异常:NullPointerException: null
@Autowired为自动装配,将对象自动注入到类中使用.
@Autowired注入有两个条件,被注入的类的对象交给了spring管理;同时使用的类的对象也要交给spring管理.两个条件都满足才能注入.
我们来看一个注入失败的例子.
使用拦截器
在拦截器中调用其他的系统,进行权限的验证.
public class Interceptor implements HandlerInterceptor {
@Autowired
private RestTemplate restTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("==============进入了拦截器");
String s = restTemplate.postForObject("http://127.0.0.1:8090/get", null, String.class);
if ("get".equals(s)) {
return true;
}
return false;
}
}
拦截器的声明
@Configuration
public class Config implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注意代码中的Interceptor是自己new出来的.这是重要改变点
registry.addInterceptor(new Interceptor()).addPathPatterns("/**");
}
}
RestTemplate 的声明
@Configuration
public class RestTemp {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
使用
看起了并没有什么异常,但是在使用的时候就会有异常抛出.显示restTemplate为空,并没有注入成功.
java.lang.NullPointerException: null
at com.utils.intercept.Interceptor.preHandle(Interceptor.java:18) ~[classes/:na]
分析
RestTemplate的对象已经交给了spring管理,但是我们如何声明的Interceptor呢,?是自己new 的对象.
这就是使用者的对象没有交给spring管理.所以@AutoWired注入失败.
正确写法
将拦截器的对象的创建交个spring
@Configuration
public class Config implements WebMvcConfigurer {
@Bean //对象交给spring
public Interceptor interceptor() {
return new Interceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(interceptor()).addPathPatterns("/**");
}
}
再次测试
访问成功了