2016-03-21 2 views
0

Ich habe eine Spring MVC-Service-Methode zum Ausführen von save() und update() - zwei Operationen.Spring MVC Rollback mit benutzerdefinierten Nachricht

Nachdem save() erfolgreich ausgeführt wurde, wenn ich finde, dass der zu aktualisierende Benutzer nicht existiert, werde ich manuell eine neue RuntimeExcetion() auslösen, um die Sicherungsoperation rückgängig zu machen. In diesem Fall, wie könnte ich die Fehlermeldung ("kann den Benutzer nicht finden") zur Seite des Browsers zurückgeben?

@Transactional(rollbackFor = { Exception.class }) 
public Map<String,Object> service(){ 
    Map<String,Object> map = new HashMap<String,Object>(); 
    //1. save user 
    User user = getUser(); 
    this.save(user); 

    //2. try to update another 
    String anotherUserId = "anUserId"; 
    User anUser = this.getById(anotherUserId); 
    if(anUser != null){ 
     anUser.setName("newName"); 
     this.update(anUser); 
     map.put("status",true); 
    }else{ 
     //logical error 
     map.put("status",false); 
     map.put("err_msg","cant find the user for update");   

     //triger rollback(rollback save user) 
     throw new RuntimeException("update user error"); 
    } 
    return map; 
} 

Antwort

0

Warum nicht Sie Ihre Fehler in einem Objekt wickeln und auf die Ausnahme passieren, während das Werfen es.

Später auf der Controller/Request-Response-Handler-Schicht, erhalten Sie das Fehler-Objekt von der Ausnahme und übergeben Sie diese an UI-Ebene.

Class CustomException extends Exception { 

    Map<String,Object> errorMap; 

    public CustomException(String errorMsg, Map errorMap) 
    { 
     super(errorMsg); 
     this.errorMap = errorMap; 
    } 
    public CustomException(Throwable cause){ 
     super(cause); 
    } 

    public CustomException(String message ,Throwable cause){ 
     super(message,cause); 
    } 
} 

Während Werfen die Ausnahme:

throw new CustomException("Can not find the user", map); 

Im Regler Ende, fangen diese Ausnahme und die ErrorMap extrahieren, die Ihre Daten enthält. Wrap/Konvertieren Sie dieses Objekt und übergeben Sie es an UI/Browser.

+0

Wirklich zu schätzen wissen! Es funktioniert perfekt, ich habe nicht daran gedacht etwas zu tun, nachdem SpringTransactional eine Ausnahme gemacht hat. –

0

Sie können eine CustomException Klasse, die Ihre Fehler msg enthalten hinzufügen.

können Sie Fehler msg an Ihren Client senden. Dafür können Sie Ihren Dienst machen, welcher Rückgabetyp Objekt wäre, weshalb er eine Map oder ErrorMessage senden kann.

CustomException Klasse sieht ungefähr wie folgt aus:

public class CustomException extends Exception implements Serializable { 

    public CustomException(String errorMsg) 
    { 
     super(errorMsg); 
    } 
    public CustomException(Throwable cause){ 
     super(cause); 
    } 

    public CustomException(String message ,Throwable cause){ 
     super(message,cause); 
    } 
} 

Sie können dies nutzen, um:

throw new CustomException("Can not find the user"); 
+0

Vielen Dank für Ihre Hilfe, vielleicht bin ich nicht ausdrücklich gut. Wenn ich die Exception (RuntimeException oder wie Ihre angegebene CustomException) werfen, wird Spring MVC diese übernehmen und Rollback-Vorgang und meine "return obj;" wird nicht ausgeführt werden. Wenn ich eine Ausnahme, Browser-Seite (Ajax Call), werfen, wie das Objekt zu bekommen? –

+0

Sie können Ihr Objekt für das Senden über das Netzwerk serialisierbar machen. 'Öffentliche Klasse CustomException extends Exception implementiert Serializable {}' –

+0

Ich löse das Problem gefolgt @Bandi Kishores Rat, in der Controller-Methode, try {service();} catch (CustomException e) {map = e.getErrorMap(); }. Nach dem try-catch-Block, nachdem SpringTransactional Rollback beendet wurde, wird diese Ausnahme an meine Controller-Methode übergeben. Dann kann ich Fehler msg handle fortsetzen. –