2016-11-10 10 views
0

У меня есть простой метод контроллера, который использует функцию 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 равно нулю, и я получаю ошибку пустого указателя исключения.

Если я удаляю require_new из распространения, все работает.

Причина использования require_new заключается в том, что для сканирования требуется много времени, и я хочу начать сканирование в своей собственной независимой новой транзакции и оставить другие вещи в обычной существующей транзакции.

Является ли мой подход правильным? Должен ли я попробовать другой подход?

+0

Установка атрибута '@ Transactional' не изменит, как Spring создает и автоматически очищает ваши компоненты, поэтому, если' relimService' имеет значение null, проблема в другом месте. – Andreas

+0

его не relimService имеет значение null. жалующихся на его объявление \t \t gzrelimRepository; ноль – Mayurb

+0

Показать полный стек. – Andreas

ответ

0

Проблема заключается в том, что вы НЕ вставляли фасоль gzrelimRepository в контроллер.

@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 не автоподелил 'gzrelimRepository'. OP не показывал декларацию, так как вы знаете, она автоувещена или нет? – Andreas

+0

gzrelimRepository - null, и я получаю ошибку исключения указателя null. – developer

+1

И OP продолжает: «Если я убираю require_new из пропозиции, все работает». Поэтому, если удаление 'REQUIRES_NEW' позволит запустить код, как вы полагаете, что с вашим предположением, что' gzrelimRepository' не является '@ Autowired', код внезапно получит ненулевое значение? – Andreas

 Смежные вопросы

  • Нет связанных вопросов^_^