最近在项目中遇到一个问题,在Impl中实现Service中的方法时,一直在报空指针异常,起初以为是数据处理的过程中存在问题,后来发现是目标service为null,导致在调试的过程中总是报空指针异常。
@Autowried
CsService csservice; // 在调试整一直为null
第一次遇到这种问题,在经过查询资料后,找到原因为项目中需要使用第三方包的监控功能,需要在项目启动时进行一次注册,在application中该impl被new修饰过,那么就不能被spring进行管理。
public static void main(String[] args) {
try {
SpringApplication.run(Application.class, args);
new listerImpl().init();
} catch (Exception ex) {
ex.printStackTrace();
}
}
解决办法也比较简单,既然自动注入不行,那就手动注入。
1. 先创建一个工具类方法:
@Component
public class GetBeanUtils implements ApplicationContextAware {
protected static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext app) throws BeansException {
if (applicationContext == null) {
applicationContext = app;
}
}
/**
* 通过类的class从容器中手动获取对象
*/
public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}
}
2. 然后在实现方法中传入class就可以了,这样就可以调用service中的方法了。
CSService csService = GetBeanUtils.getBean(CsService.class);
参照:使用@Autowired注解获取对象为null的几种情况_autowired注入的对象为null_小孙的Blog的博客-优快云博客