@Autowired无法注入,异常:NullPointerException: null

19 篇文章 0 订阅
6 篇文章 0 订阅

@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("/**");
    }
}

再次测试

访问成功了
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值