sábado, 10 de marzo de 2018

Control de Excepciones en Servicio REST de Spring

Ya vimos hace tiempo como hacer un servicio REST con Spring Boot aquí. Ahora veremos como hacer de una forma limpia el manejo de posibles excepciones. 

La teoría es sencilla, debemos crear otro método en la clase que contiene el servicio con la anotación '@ExceptionHandler'. De esta forma podremos indicar cual es la excepción que trataremos si es lanzada por nuestro servicio. Y tratarla como queramos, en este caso hemos creado un objeto JSON que muestra la URL del error y un mensaje explicativo del mismo. Además con '@ResponseStatus' podremos indicarle el código de error y una descripción. 

@ExceptionHandler(NotFoundException.class)
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Element not found")
public String handleNotFoundException(final HttpServletRequest req, final NotFoundException ex) {
 String errorURL = req.getRequestURL().toString();
 return new ErrorResponse(errorURL, ex.getMessage());
}

Otra opción si la excepción vamos a tener que tratarla en varios controladores, es crearla en una clase asociada a la anotación '@ControllerAdvice'. De esta forma será tratada para todos los controladores. Si debemos tener en cuenta que al no encontrarnos en un '@RestController' como en el caso anterior, deberemos indicar que la salida es '@ResponseBody' si queremos que tenga el mismo tratamiento que en el método anterior.

@ControllerAdvice
public class ExceptionController {
 @ExceptionHandler(ArithmeticException.class)
 @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
 @ResponseBody
 public String handleNotArithmeticException(final HttpServletRequest req, final ArithmeticException ex) {
  String errorURL = req.getRequestURL().toString();
 return new ErrorResponse(errorURL, ex.getMessage());
 }
}




No hay comentarios:

Publicar un comentario