Revisa a primero esta Wiki Manejo de errores en servicios REST.
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:
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>
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.
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 //