Spring Propagation.REQUIRES_NEW nullfies自动装配的存储库

时间:2016-11-10 22:07:40

标签: java spring spring-transactions

我有一个简单的控制器方法,它使用Spring事务的propagation=Propagation.REQUIRES_NEW功能。

@Autowired
GzrelimRepository gzrelimRepository;



@Autowired
RelimService relimService;

@RequestMapping("/startScanning")
@Transactional(propagation=Propagation.REQUIRES_NEW)
private void scanResults(@NotNull String matchingSrc, @NotNull String rangeStart, @NotNull String rangeEnd, @NotNull Integer scanPid){

    gzrelimRepository.pScanDupPidmWrap(matchingSrc, rangeStart, rangeEnd, scanPid);

}

当我调用此方法时,gzrelimRepository为null并且我得到空指针异常错误。

如果我从传播中删除requires_new,那么事情就有效了。

使用requires_new的原因是,扫描需要花费大量时间,我想在自己的独立新事务中开始扫描,并在正常的现有事务中休息其他事情。

我的方法是否正确?我应该尝试其他方法吗?

1 个答案:

答案 0 :(得分:0)

问题是你没有将gzrelimRepository bean注入你的控制器。

@Autowired
RelimService relimService;

@Autowired
GzrelimRepository gzrelimRepository;

@RequestMapping("/startScanning")
@Transactional(propagation=Propagation.REQUIRES_NEW)
private void scanResults(@NotNull String matchingSrc, @NotNull String rangeStart, @NotNull String rangeEnd, @NotNull Integer scanPid){

    gzrelimRepository.pScanDupPidmWrap(matchingSrc, rangeStart, rangeEnd, scanPid);

}

我建议不要在Controller级别使用@Transactional,而是需要在服务/ DAO层管理事务。