Gestión Global de Excepciones en Jersey


¿Hay alguna manera de tener un manejo global de excepciones en Jersey? En lugar de que los recursos individuales tengan bloques try/catch y luego llamen a algún método que luego desinfecte todas las excepciones que se enviarán al cliente, esperaba que hubiera una manera de poner esto donde se llaman realmente los recursos. ¿Es esto posible? Si es así, ¿cómo?

En lugar de, donde sanitize(e) lanzaría algún tipo de excepción configurada por Jersey a la Camiseta servlet:

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

Teniendo:

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

Donde la excepción se lanzaría a algo que puedo interceptar y llamar sanitize(e) desde allí.

Esto es realmente solo para simplificar todos los recursos de Jersey y garantizar que las excepciones que regresan al cliente siempre estén en algún tipo de forma comprensible.

Author: Trisfall, 2012-06-09

2 answers

Sí. JAX-RS tiene un concepto de ExceptionMappers. Puede crear su propia interfaz ExceptionMapper para asignar cualquier excepción a una respuesta. Para más información ver: https://jersey.github.io/documentation/latest/representations.html#d0e6352

 40
Author: Martin Matula,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-13 15:38:27

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();
  }
}
 4
Author: AlikElzin-kilaka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-21 15:58:18