2017-08-07 2 views
0

Ich habe eine Methode für eine Aktionsschaltfläche in JSF in der Backing-Bean definiert. Ich verwende Hibernate als ORM. Ich kann die neuen Daten speichern. Aber wenn ich versuche, die gleichen Daten zu aktualisieren, wird eine Transaktion Rollback AusnahmeSpring @Transaction Rollback nach Abschluss einer Aktionsmethode

geworfen
javax.faces.FacesException: #{itemModificationBean.saveData('0','IM')}: org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only 
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118) 
    at javax.faces.component.UICommand.broadcast(UICommand.java:315) 
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282) 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:98) 
    at 

Ich habe keine Schnittstelle für das Verfahren implementiert, und es wird in dem Träger Bean selbst genannt und definiert.

Gibt es eine Möglichkeit, um herauszufinden, was schief läuft? ....

Jede Hilfe

würde geschätzt

Lassen Sie mich wissen, ob weitere Details benötigt werden, mehr zu diesem Thema zu erarbeiten

Backing Bean

ItemBackingBean Aktionsmethode

@Transactional(readOnly=false, propagation=Propagation.REQUIRED) 
public String saveData(String action, String app) throws WFException { 

    setSaveOrSubmitStatus(action); 
    setCurrentApp(app); 
    //DB operations 
    . 
    . 
    . 
    . 
    . 
    return requestNo 
} 

Die Komponente

<p:commandButton value="#{msg.save}" type="submit" id="modifySav" 
         process="@form @this" 
         action="#{itemModificationBean.saveData('0','IM')}" 
         rendered="#{itemAttributeBean.getRenderedValue('modifySav')}" 
         update="@([id$=form]) @([id$=collectionTab]) @([id$=itemRequestDetailsGrid]) @([id$=saveDialogItemMod])" 
         style="float:right;" /> 
+0

Haben Sie Java-Code? –

+0

Es ist eine ziemlich große Methode als ein Legacy-Code. So habe ich die wesentlichen Teile hinzugefügt – sandeepsharat

+0

Können Sie die vollständige Implementierung von Backing Bean einschließen? Kannst du auch die Ausnahme in der BackingBean abfangen und den StackTrace ausdrucken und das auch aufnehmen? Scheinbar scheint das Update fehlzuschlagen. Können Sie auch die Definition des Ruhezustands mit einbeziehen? – yaswanth

Antwort

0

Von Ihrem stacktrace gesagt wird, dass

Transaktion Rollback markiert wurde nur

würde ich diese Schritte vor:

  1. Bestimmen Sie, wo die Transaktion gestartet wird. Da Sie verschiedene Strategien haben können, müssen Sie den ersten Ort herausfinden, an dem es gestartet wird.
  2. Untersuchen Sie alle Methoden, die den gleichen Transaktionskontext verwenden (alle Methoden, bei denen die Transaktion während der Ausführung propagiert wurde) und versuchen Sie, Ausnahmen zu erhalten, die die Transaktion rückgängig machen: Transaktionswechsel der Richtlinien Ihres Containers überprüfen. Spring zum Beispiel zurückrollen, wenn Runtime-Ausnahmen aufgetreten sind (überprüfen Sie docs).
  3. Identifizieren Sie Ausnahme und Gründe für sie und dann entsprechend handeln.

Von dem, was ich von den qestion Details sehen kann es Methoden, die aus dem Backing Bean saveData Methode aufgerufen werden, die in dem gleichen Transaktionskontext sind. Daher kann das Update selbst so funktionieren, wie es sein sollte, aber frühere Methodenaufrufe haben die aktuelle Transaktion nur als Rollback markiert. Überprüfen Sie ihre Transaktionsausbreitungsstrategien.

Ich gehe davon aus, dass einige der Methoden vor der Datenbankoperation die Transaktion durch eine Ausnahme rückgängig gemacht oder die Transaktion explizit als nur zurückgesetzt markiert wurde. Diese Methoden lösen keine Ausnahme aus, weshalb der Programmfluss mit dem Aufruf der Datenbankoperationsmethode fortgesetzt wird, aber nicht im selben Transaktionskontext erfolgen kann.

Verwandte Themen