Использованные методы:
1. Struts Action
2. Метод класса обслуживания (аннотируется @Transactional)
3. Звонок на веб-сервис Xfire
Все, включая Struts (DelegatingActionProxy) и транзакции, настроены с помощью Spring.
Постоянство выполняется с помощью JPA / Hibernate.
Иногда веб-служба генерирует непроверенное исключение. Я ловлю это исключение и выбрасываю проверенное исключение. Я не хочу, чтобы транзакция откатывалась, поскольку исключение веб-службы изменяет текущее состояние. Я аннотировал метод следующим образом:
@Transactional(noRollbackFor={XFireRuntimeException.class, Exception.class})
public ActionForward callWS(Order order, ....) throws Exception
(...)
OrderResult orderResult = null;
try {
orderResult = webService.order(product, user)
} catch (XFireRuntimeException xfireRuntimeException) {
order.setFailed(true);
throw new WebServiceOrderFailed(order);
} finally {
persist(order);
}
}
Я все еще получаю это исключение:
org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
Когда я пытаюсь воспроизвести это с помощью junit, транзакция не помечается для отката, и все еще можно зафиксировать транзакцию.
Как заставить Spring не откатывать транзакцию?