Wie Sie verhindern, dass der PPV ein Rollback der Transaktion?
Methoden aufgerufen:
1. Struts-Aktion
2. Service Klasse-Methode (annotiert durch @Transactional)
3. Xfire-webservice-Aufruf
Alles, einschließlich der Streben (DelegatingActionProxy) und Transaktionen konfiguriert ist, mit dem Frühling.
Persistenz erfolgt mit JPA/Hibernate.
Manchmal den webservice werfen eine ungeprüfte Ausnahme. Ich habe diese Ausnahme abfangen und werfen einer checked exception. Ich will nicht, dass die Transaktion ein Rollback, da die web-service-Ausnahme-ändert den aktuellen Zustand. Ich habe kommentiert das Verfahren so:
@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);
}
}
Bekomme ich noch diese Ausnahme:
org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
Wenn ich versuche das zu reproduzieren mit junit, die Transaktion ist nicht markiert für roll zurück und es ist immer noch möglich, einen commit für die Transaktion.
Wie mache ich die Quelle nicht um ein Rollback für die Transaktion?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Geschafft ein Testfall für dieses problem:
FakeService:
WebService:
Diese wird neu die rollback-Ausnahme.
Dann merkte ich, dass die Transaktion wohl gekennzeichnet wird als rollbackOnly im WebService.letsThrowAnException da WebService wird auch transactional. Ich zog Anmerkungen:
Nun die Transaktion wird nicht zurückgerollt, und ich kann die änderungen zu Bestellen.
Müssen Sie nicht werfen Sie eine Ausnahme, wo der Frühling kann es sehen. In diesem Fall müssen Sie nicht werfen
WebServiceOrderFailed()
. Die Lösung ist ein split der code in zwei Methoden. Die erste Methode hat den Umgang mit Fehlern und gibt die Ausnahme, dass die äußere Methode erstellt die Transaktion.[BEARBEITEN] Als für
noRollbackFor
: Versuchen Sie zu ersetzenException.class
mitWebServiceOrderFailed.class
.noRollbackFor
prüft angegebenen exception-Klasse und all Ihrer Unterklassen: static.springsource.org/spring/docs/2.5.x/api/org/... darüber hinaus standardmäßig aktiviert Ausnahmen wird das rollback NICHT ausgelöst: static.springsource.org/spring/docs/2.5.x/reference/...WebServiceOrderFailed
.noRollbackFor={..., Exception.class}
) können keinen Effekt da die Ausnahme ist speziell behandelt (andernfalls wird die erbschaft-code ließe sich auch ignorieren, RuntimeException, da es extends Exception).