2012-06-08 19 views
38

¿Hay alguna forma de tener un manejo global de excepciones en Jersey? En lugar de recursos individuales que tienen bloques try/catch y luego llaman a algún método que desinfecta todas las excepciones que se enviarán de vuelta al cliente, esperaba que hubiera una forma de expresar esto en el lugar donde realmente se llaman los recursos. ¿Esto es posible? ¿Si es así, cómo?Manejo global de excepciones en Jersey

En lugar de donde sanitize(e) lanzaría algún tipo de excepción Jersey-configurado para el servlet Jersey:

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

Tener:

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

donde la excepción serían botados a algo que pueda interceptar y llamar al sanitize(e) desde allí.

Esto es simplemente para simplificar todos los recursos de Jersey y para garantizar que las excepciones que se envían al cliente sean siempre de alguna forma comprensible.

Respuesta

38

Sí. JAX-RS tiene un concepto de ExceptionMappers. Puede crear su propia interfaz ExceptionMapper para mapear cualquier excepción a una respuesta. Para obtener más información, consulte: https://jersey.github.io/nonav/documentation/1.12/jax-rs.html#d4e435

+3

Esto funciona si hago ExceptionMapper de modo que todas las excepciones son enrutados a ese método. Gracias. – Trisfall

+3

O incluso 'ExceptionMapper ', entonces también puedes manejar 'Error's lanzados. – tsauerwein

3

javax.ws.rs.ext.ExceptionMapper es su amigo.

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

Ejemplo:

@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

Por cierto, parece que no todas las excepciones pasaron por el 'ExcpetionMapper'. 'WebApplicationException' se manejó en otro lugar. Esto es un problema si quisiera registrar todas las excepciones, por ejemplo. –