2012-06-08 16 views
38

Gibt es eine Möglichkeit, globale Ausnahmebehandlung in Jersey zu haben? Anstatt dass einzelne Ressourcen try/catch-Blöcke haben und dann eine Methode aufrufen, die dann alle Ausnahmen bereinigt, die zurück an den Client gesendet werden sollen, hatte ich gehofft, dass es einen Weg gibt, dies dort zu platzieren, wo die Ressourcen tatsächlich aufgerufen werden. Ist das überhaupt möglich? Wenn das so ist, wie?Globale Ausnahmebehandlung in Jersey

statt, wo sanitize(e) irgendeine Art von Jersey-konfigurierte Ausnahme von dem Jersey-Servlet werfen würde:

@GET 
public Object getStuff() { 
    try { 
     doStuff(); 
    } catch (Exception e) { 
     ExceptionHandler.sanitize(e); 
    } 
} 

Mit:

@GET 
public Object getStuff() throws Exception { 
    doStuff(); 
} 

, wo die Ausnahme, um etwas bekommen geworfen würde, dass ich kann abfangen und sanitize(e) von dort anrufen.

Dies ist wirklich nur, um alle Jersey-Ressourcen zu vereinfachen und zu garantieren, dass die Ausnahmen, die zurück zum Client gehen, immer in einer irgendwie verständlichen Form sind.

Antwort

38

Ja. JAX-RS hat ein Konzept von ExceptionMappers. Sie können Ihre eigene ExceptionMapper-Schnittstelle erstellen, um eine Ausnahme einer Antwort zuzuordnen. Für weitere Informationen siehe: https://jersey.github.io/nonav/documentation/1.12/jax-rs.html#d4e435

+3

Dies funktioniert, wenn ich machen ExceptionMapper so dass alle Ausnahmen von diesem Verfahren geroutet. Vielen Dank. – Trisfall

+3

Oder sogar 'ExceptionMapper ', dann können Sie auch geworfene 'Fehler' behandeln. – tsauerwein

3

javax.ws.rs.ext.ExceptionMapper ist dein Freund.

Quelle: https://jersey.java.net/documentation/latest/representations.html#d0e6665

Beispiel:

@Provider 
public class EntityNotFoundMapper implements ExceptionMapper<javax.persistence.EntityNotFoundException> { 
    public Response toResponse(javax.persistence.EntityNotFoundException ex) { 
    return Response.status(404). 
     entity(ex.getMessage()). 
     type("text/plain"). 
     build(); 
    } 
} 
+1

BTW, es scheint, dass nicht alle Ausnahmen den 'ExcpetionMapper' durchlaufen haben. 'WebApplicationException' wurde an anderer Stelle behandelt. Dies ist ein Problem, wenn ich zum Beispiel alle Ausnahmen protokollieren möchte. –