我有一个简单的控制器方法,它使用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的原因是,扫描需要花费大量时间,我想在自己的独立新事务中开始扫描,并在正常的现有事务中休息其他事情。
我的方法是否正确?我应该尝试其他方法吗?
答案 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层管理事务。