Metody wywoływane:
1. Struts Action
2. Służba metody klasy (odnotowany przez @Transactional)
3. Xfire połączenia webservicesJak uniemożliwić WZP wycofanie transakcji?
Wszystko w tym rozpórki (DelegatingActionProxy) oraz transakcji jest skonfigurowany z wiosny.
Trwałość jest wykonywana za pomocą JPA/Hibernate.
Czasami usługa sieciowa generuje niesprawdzony wyjątek. Przechwycę ten wyjątek i wyrzucę sprawdzony wyjątek. Nie chcę, aby transakcja została wycofana, ponieważ wyjątek usługi sieci Web zmienia bieżący stan. Mam adnotacją metodę tak:
@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);
}
}
wciąż otrzymuję ten wyjątek:
org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
Kiedy próbuję odtworzyć ten z JUnit, transakcja nie jest oznaczony na rolce powraca i jest to nadal możliwe zatwierdzić transakcję.
Jak sprawić, aby Spring nie wycofywał transakcji?
To jest nieprawidłowe. 'noRollbackFor' sprawdza określoną klasę wyjątków i wszystkie jej podklasy: http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/transaction/annotation/Transactional.html#noRollbackFor() Dodatkowo Domyślnie zaznaczone wyjątki NIE spowodują cofnięcia: http://static.springsource.org/spring/docs/2.5.x/reference/transaction.html#transaction-declarative-attransactional-settings – ChssPly76
To nie wyjaśnia, dlaczego powyższy kod cofa się na 'WebServiceOrderFailed'. –
Zgaduję, że WebServiceOrderFailed jest RuntimeException i powyższy kod ('noRollbackFor = {..., Exception.klasa} ') nie może mieć żadnego efektu, ponieważ wyjątek jest obsługiwany specjalnie (w przeciwnym razie kod dziedziczenia również zignorowałby wyjątek RuntimeException, ponieważ rozszerza wyjątek). –