你的位置:首页 > Java教程

[Java教程]欲哭无泪的@Autowired注入对象为NULL

欲哭无泪啊...一下午的时间就这么被浪费了...一个基于spring mvc和spring data jpa的小项目,当我写完一个controller的测试用例后,一运行却报空指针,跟了下是一个dao为null.然后看一下这个dao的代码:

@Component@Transactionalpublic class XXService {    private Logger logger = LoggerFactory.getLogger(getClass());    @Autowired  private XXDao xxDao;     public void add(XX xxl) {        logger.debug("进入XXService.add(XX xx)方法");    xxDao.save(xx); //此处报空指针,原因是xxDao为null
}

一开始我都没认为这个xxDao会是null,以为是参数有问题,然而断点跟了一下发现不仅参数没问题,程序整体过程中都没有任何不对劲的地方,只有运行到这个dao才报错..因为这个dao是jpa自动实现的,我就想当然的认为可能是参数或是映射问题导致的生成实现的过程中出现问题,不过现在想想,虽然自动实现dao的过程可能失败,但是不应该报空指针.百度了一圈,看到个关于@Autowired注入失败的帖子,此时才想到可能是dao注入失败了,再跟一遍代码,的确这里dao没有注入jpa生成的实现,直接就是个null.这我就有点无解了,别又是spring的什么bug或是jar包冲突,这还怎么玩?当年学spring的时候就遇到过各种奇葩问题,写错的代码却得到正确结果,写对的代码却因为各种原因一直报错..

虽然有点无解,但是原帖中有人提过要在所有使用dao的地方包括service都需要@Autowired注入,否则就会失效,那么我检查一下吧,虽然不报希望,因为这段代码是我们leader写了一半的时候我接着写的,犯错的概率很小的.话虽这么说,但是看到了如下这段代码:

@RestController@RequestMapping(value = "/xxx/xx")public class XXController {  Logger logger = LoggerFactory.getLogger(getClass());    private XXService xxService = new XXService();   .....}

我当时就倒了...这里忘了注入也就算了,然而还直接new了一个对象,这样调用service的时候也不报错...然后dao层注入直接失败..

这里印证了之前看到的那个帖子中的观点:必须在所有使用了dao的地方,包括调用它的servcie都要进行@Autowired注入,否则之后的注入就会失败..