2017-03-10 1 views
0

Es tut mir leid, wenn diese Frage schon einmal gestellt wurde. Ich bin neu in Spring Framework und ich habe eine praktische Frage über @Transactional und ein Problem, das ich habe.Wie alle Fehler von einer @ Transactional markierten Methode zurückgegeben werden?

In einer Schleife füge ich einige Objekte in die Datenbank ein, die JDBC und eine gespeicherte SQL-Prozedur verwenden. Die Eingabe kann aus irgendeinem Grund für einige/keine/alle Objekte fehlschlagen. Wenn alle Inserts fehlerfrei sind ok, sonst müssen zwei Dinge getan werden. Zuerst müssen alle erfolgreichen Einfügungen zurückgesetzt werden, und die Liste aller Fehler muss zurückgegeben werden.

Bis jetzt habe ich einen Code, der das Rollback ausführt, aber ich kann nicht herausfinden, wie ein Array mit den Fehlern zurückgegeben wird.

Dieser Code funktioniert gut, es fügt alle Objekte ein und wenn einer von ihnen fehlschlägt, rollt es zurück. Das Problem ist, dass ich die Liste der Fehler nicht zurückgeben kann.

Haben Sie eine Idee, wie Sie dieses Problem lösen können?

+0

Geben Sie einfach errors.toArray(); – user1211

+0

und wie würden Sie den Rollback in diesem Fall tun? – rob

+0

Warum nicht die Fehler in das Ausnahmeobjekt einfügen? – kaqqao

Antwort

1

können Sie suppressed Ausnahmen verwenden:

public static void main(String[] args) throws TransactionRolledbackException { 


    TransactionRolledbackException te = null; 

    for (int i = 0; i < 3; i++) { 

     try{ 
      //doStuff 
      throw new NullPointerException("Exception no:" + i); 
     }catch (Exception e) { 
      if(te == null){ 
       te = new TransactionRolledbackException(); 
      } 

      te.addSuppressed(e); 
     } 


    } 


    if(te != null){ 
     throw te; 
    } 
} 

Ausgang:

Exception in thread "main" javax.transaction.TransactionRolledbackException 
    at chapter4.Exceptionsss.main(Exceptionsss.java:18) 
    Suppressed: java.lang.NullPointerException: Exception no:0 
     at chapter4.Exceptionsss.main(Exceptionsss.java:15) 
    Suppressed: java.lang.NullPointerException: Exception no:1 
     at chapter4.Exceptionsss.main(Exceptionsss.java:15) 
    Suppressed: java.lang.NullPointerException: Exception no:2 
     at chapter4.Exceptionsss.main(Exceptionsss.java:15) 
+1

Das ist eigentlich ziemlich glatt! Danke für die Antwort. – rob

+0

@rob ich bin froh, dass es geholfen hat – HRgiger

0

Bisher habe ich mit einem Code kommen, die das Rollback der Fall ist, aber ich kann nicht herausfinden, wie zurückzukehren ein Array mit den Fehlern.

Wenn Sie versuchen, die Fehler zurück und alles, was Sie tun können, ist eine Ausnahme auslösen, dann können Sie Ihre eigene Ausnahme schreiben, die in ihm ein List<String> errors Feld hat. Dann würden Sie tun:

throw new ExceptionWithErrors(cause, errors); 

Wenn Sie die Ausnahme zurück in den Anrufer fangen dann können Sie ewe.getErrors() nennen. Ich neige dazu, Daten nicht in Ausnahmen zu speichern, weil ich einige wirklich schlechte Beispiele dafür gesehen habe, aber in Ihrem Fall, wenn Sie Fehlerdetails speichern, scheint dieses Muster gut zu sein.

Ein mögliches Problem mit diesem Mechanismus ist, dass ich Probleme hatte, wenn das Beenden der Transaktion die Sache ist, die den Rollback verursacht. Ich hatte sogar Probleme, wenn ich eine Ausnahme ausspreche, aber dann, wenn die Transaktion beendet ist, wird eine weitere Ausnahme generiert und die erste (mit dem Fehlerkontext) ist verloren.

Verwandte Themen