2016-11-10 53 views
0

我有一個簡單的控制器方法,它使用了Spring事務的propagation=Propagation.REQUIRES_NEW特性。Spring Propagation.REQUIRES_NEW nullfies autowired repositories

@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爲空,我得到空指針異常錯誤。

如果我從傳播中移除requires_new,事情就會起作用。

使用requires_new的原因是,掃描需要很多時間,我想在自己的獨立新事務中開始掃描,並在正常的現有事務中休息其他事物。

我的方法是否正確?我應該嘗試其他方法嗎?

+0

設置「@ Transactional」的屬性不會改變Spring創建和自動裝載你的bean的方式,所以如果'relimService'爲null,問題就在其他地方。 – Andreas

+0

其不是relimService爲空。其抱怨\t \t gzrelimRepository;爲空 – Mayurb

+0

顯示完整的履單棧。 – Andreas

回答

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); 

} 

我建議不要在控制器級別使用@Transactional,而交易需要在服務/ DAO層進行管理。

+0

你怎麼知道OP沒有autowire'gzrelimRepository'。 OP沒有顯示聲明,那麼如何知道它是否是自動裝配的? – Andreas

+0

gzrelimRepository爲空,我得到空指針異常錯誤。 – developer

+1

並且OP繼續「如果我從proping中移除require_new,那麼事情就會起作用。」因此,如果刪除'REQUIRES_NEW'將允許代碼運行,那麼您如何相信,假設'gzrelimRepository'不是'@ Autowired',代碼會突然有非空值? – Andreas