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?

Schreibe einen Kommentar