Implementación de una API RESTful con Spring Framework (VII): Excepciones y códigos de respuesta

, , No Comments
En esta ocasión hablaré del tratamiento de excepciones y de los códigos de respuesta de nuestra API RESTful. Si recordamos la primera versión de la API, no teníamos ningún mecanismo que informara al cliente de que un determinado recurso no existía. Si por ejemplo realizábamos la petición GET /libro/87, el servidor no devolvería ningún resultado, pero el código de respuesta sería 200 (OK).

Para este caso concreto, lo correcto sería devolver un código de respuesta 404 (Not found). Puedes encontrar más información sobre los diferentes tipos de códigos de respuesta aquí



Para proveer a nuestros servicios de los mecanismos de tratamiento de excepciones y generación de códigos de respuesta necesarios, hemos creado un nuevo paquete de nombre spring.rest.jpa.ii.exception en el que se han implementado dos clases.
  • ResourceNotFoundException: es la excepción que extiende de RuntimeException y que se lanzará cada vez que se pida un recurso inexistente. En el constructor, podemos pasar el identificador del recurso que se ha solicitado pero que no existe en base de datos.


  • RestExceptionController: es el controlador que gestionará las excepciones lanzadas en los controladores de nuestra API. Es por eso que se ha utilizado la anotación @ControllerAdvice en la línea 21. La clase dispone de un método llamado resourceNotFound que se invocará para gestionar la excepción lanzada. El método utiliza las siguientes anotaciones.
    • @ExceptionHandler: con esta anotación informamos del tipo de excepción que gestionará el método, en este caso ResourceNotFoundException
    • @ResponseStatus: indicamos el código de respuesta a devolver, en este caso un 404.
    • @ResponseBody: para incluir un mensaje informativo en referencia al recurso inexistente.


De esta forma, si realizamos la petición GET /libro/87, se devolverá un código de respuesta 404 indicando que el recurso no existe, además de un mensaje del tipo "El recurso [87] no ha sido encontrado".


Pulsa aquí para acceder al código de esta entrada en mi repositorio Github

0 comentarios:

Publicar un comentario