2017-08-02 3 views
2

Ich verwende Spring-Boot und JPA. Ich habe versucht, ungeprüfte Ausnahme wie (Constraint Violation), die Transaktion einwerfen zu fangen. Selbst wenn ich catch block hinzugefügt habe, wird es ausgelöst, wenn die Transaktionsgrenze überschritten wird.So fangen Sie ungeprüfte Transaktionsausnahme

Ich habe gegoogelt und gefunden, dass durch Transaktionsrückruf erreicht werden kann. Ich versuchte unten Code: immer noch geben Fehler

public class TransactionAspect extends TransactionSynchronizationAdapter { 

    @Before("@annotation(org.springframework.transaction.annotation.Transactional)") 
    public void registerTransactionSyncrhonization() { 
     TransactionSynchronizationManager.registerSynchronization(this); 

    } 

    @Override 
    public void afterCompletion(int status) { 
     // code 
     System.out.println(status); 
    } 
} 

Bitte helfen Sie mir!

Antwort

2

Sie müssen den JPA-Entitätsmanager in try{ manager.flush(); }catch(ConstraintViolationException){} manuell leeren. @Transactional Aspekt ist um die Methode Aufruf und Sie können diese Ausnahme nicht abfangen, wie es nach dem Aufruf der Methode geleert wird.

+0

+1 Danke..yeah. Du hast recht. Aber gibt es eine andere Problemumgehung, ohne manuell Flush aufzurufen? wie ich es überall manuell nennen muss. Ich möchte es generische Logik machen – NFE

+0

@NFE Ich habe keine Idee, aber Sie können versuchen, extrahieren versuchen {} catch {} in Methode eine Ebene über '@ Transactional' oder verwenden Sie' @ ExceptionHandler', um Ausnahmen global zu fangen –