Методы вызова: метод класса
1. Действие Struts
2. Услуги (аннотированный по @Transactional)
3. Xfire WebService вызоваКак предотвратить JPA от отката транзакции?
Все, включая распорки (DelegatingActionProxy) и транзакции выполнен с весной.
Сохранение выполняется с помощью 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 не откатывать транзакцию?
Это неверно. 'noRollbackFor' проверяет указанный класс исключения и все его подклассы: http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/transaction/annotation/Transactional.html#noRollbackFor() Дополнительно , по умолчанию проверенные исключения НЕ будут запускать откат: http://static.springsource.org/spring/docs/2.5.x/reference/transaction.html#transaction-declarative-attransactional-settings – ChssPly76
Это не объясняет, почему выше приведенный выше код возвращается к 'WebServiceOrderFailed'. –
Я предполагаю, что WebServiceOrderFailed - это исключение RuntimeException и код выше ('noRollbackFor = {..., Exception.class} ') не может иметь никакого эффекта, поскольку Exception обрабатывается специально (в противном случае код наследования также игнорирует RuntimeException, поскольку он расширяет Exception). –