Mapeo de excepciones en JAX-RS

JAX-RS define un sistema para capturar y “mapear” excepciones para convertirlas automáticamente a objetos Response.
Esto puede ser útil cuando estamos trabajando con servicios REST con multitud de excepciones posibles (propias o de librerías de terceros) y queremos dar un tratamiento personalizado a alguna excepción.

Para crear un Mapper de una excepción hay que realizar los siguientes pasos:

  1. Crear una clase que implemente la interfaz ExceptionMapper.
  2. Anotar la clase con la notación @Provider.
  3. Implementar el método toResponse.


1. Interfaz ExceptionMapper

Debe implementarse la interfaz ExceptionMapper pasándole como parámetro la excepción que queremos capturar.

public interface ExceptionMapper<E extends Throwable> {
{
   Response toResponse(E exception);
}

Ejemplo:
En este ejemplo se captura la excepción PruebaRestException.

 @Provider
 public class PruebaRestExceptionMapper implements ExceptionMapper<PruebaRestException> 


2. Provider

La notación @Provider registra la clase en el runtime de JAX-RS.
Con esto se consigue capturar la excepción pasada como parámetro a la interfaz tal y como se mostró en el paso 1 (Recordemos la excepción del ejemplo PruebaRestException).

Es importante indicar que cuando se lanza una excepción en un servicio REST, JAX-RS busca en su registro de providers un ExceptionMapper que capture esta excepción.
Si no lo encuentra busca un ExceptionMapper que capture la clase de la que hereda la excepción lanzada.
Este proceso se repite hasta que encuentre un Mapper.

Ejemplo:
Tenemos una excepción HijaPruebaRestExcepction que extiende PruebaRestException vista en el paso 1:

  public class HijaPruebaRestException extends PruebaRestException

Si en nuestro servicio se lanza una instancia de HijaPruebaRestException, JAX-RS buscará un mapper de esta excepción.
Al no encontrarlo, subirá en la herencia y buscará un mapper para PruebaRestException.
Como este mapper lo hemos definido en el ejemplo del paso 1, el resultado será que la excepción HijaPruebaRestException será capturada por PruebaRestExceptionMapper.


3. Método toResponse

Para finalizar hay que implementar el método toResponse. En este método se capturará la instancia de la excepción que ha sido lanzada y se construirá el objeto Response con la información que queremos que se devuelva.

Ejemplo:

@Provider
public class EntityNotFoundMapper
     implements ExceptionMapper<EntityNotFoundException> {
 
   public Response toResponse(EntityNotFoundException e) {
      return Response.status(Response.Status.NOT_FOUND).build();
   }
}


Pon aquí tus propuestas de FAQs, indicando qué problema tienes, y buscaremos la solución lo antes posible. Si además lo has resuelto, puedes indicar cómo lo has hecho.

Formato de petición de FAQ:

**Título**
//Descripción del problema//
//Tecnología afectada (Fundeweb 1/2)//
//Cómo reproducir el error//
**Solución**
//Descripción de la solución//

Tus datos de contacto  --- //[[correo@umOticarum.es|Tu Nombre]] dd/mm/yyyy //
  • fdw2.0/fundeweb2.0/gt/rest/mapeo_excepciones_rest.txt
  • Última modificación: 19/12/2019 10:03
  • por RAMON GINEL GEA