Backend
Spring
Errores
API
Las respuestas JSON de error se pueden definir localmente dentro de cada RestController
o bien desde un manejador global de excepciones no capturadas (anotado con @ControllerAdvice
). Vamos a personalizar las respuestas de error del API de contadores para los siguientes casos de error:
- Se proporcionan datos incorrectos para crear un contador.
- Se intenta crear un contador que ya existe.
- Se intenta usar un contador que no existe.
Para ello, sobre el proyecto MVC realiza los siguientes cambios:
-
Añade esta excepción para el primer caso de error:
public class ExcepcionContadorIncorrecto extends RuntimeException { private List<FieldError> errores; public ExcepcionContadorIncorrecto(BindingResult result) { this.errores = result.getFieldErrors(); } public List<FieldError> getErrores() { return errores; } }
-
Añade este record al modelo para personalizar la respuesta JSON de error:
public record ModeloCampoIncorrecto(String error, String campo, Object valor) { }
-
Añade esta función dentro de
ControladorRest
para controlar localmente los errores de tipoExcepcionContadorIncorrecto
:@ExceptionHandler(ExcepcionContadorIncorrecto.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public List<ModeloCampoIncorrecto> contadorIncorrecto(ExcepcionContadorIncorrecto ex) { return ex.getErrores().stream().map(error -> new ModeloCampoIncorrecto( error.getDefaultMessage(), error.getField(), error.getRejectedValue() )).toList(); }
-
Añade esta clase para controlar globalmente todos los errores de tipo
ResponseStatusException
:@ControllerAdvice public class ManejadorErroresGlobales { @ResponseBody @ExceptionHandler(ResponseStatusException.class) public ResponseEntity errorLanzado(ResponseStatusException ex) { return new ResponseEntity<>(ex.getStatusCode()); } }
❓ Ejercicio 1: Modifica el código de la función
crea
deControladorRest
para que, en caso de que la validación falle, lance la excepciónExcepcionContadorIncorrecto(bindingResult)
.
❓ Ejercicio 2: Modifica el código de la función
crea
deControladorRest
para que, en caso de que el contador ya exista, lance la excepciónResponseStatusException(HttpStatus.CONFLICT)
.
❓ Ejercicio 3: Modifica el código de las funciones
contador
eincrementa
deControladorRest
para que, en caso de que no exista el contador, lancen la excepciónResponseStatusException(HttpStatus.NOT_FOUND)
.