Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

Haga lo que hicimos: RestControllerAdvice

@RestControllerAdvice
public class GestorDerErrores {

    @ExceptionHandler(EntityNotFoundException.class)
    public ResponseEntity getionarError404() {
        return ResponseEntity.notFound().build();
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity getionarError400(MethodArgumentNotValidException ex) {
        var errores = ex.getFieldErrors();
        return ResponseEntity.badRequest().body(errores.stream().map(DatosErrorValidacion::new).toList());
    }

    public record DatosErrorValidacion(String campo, String mensaje) {
        public DatosErrorValidacion(FieldError error){
            this(error.getField(), error.getDefaultMessage());
        }
    }
}
1 respuesta

Hola Justin,

Parece que estás trabajando en la gestión de excepciones en una API Rest usando Spring Boot. Tu implementación de @RestControllerAdvice se ve bastante bien, pero hay algunos detalles que podrías considerar para mejorar o verificar:

  1. Tipado de Respuesta: En tus métodos getionarError404 y getionarError400, podrías especificar el tipo genérico de ResponseEntity. Por ejemplo, para getionarError404, podrías usar ResponseEntity<Void> y para getionarError400, podrías usar ResponseEntity<List<DatosErrorValidacion>>.

  2. Nombres de Métodos: Asegúrate de que los nombres de tus métodos estén correctamente escritos. Por ejemplo, parece que getionarError404 y getionarError400 podrían ser un error tipográfico de "gestionar".

  3. Manejo de Errores: En el método getionarError400, estás mapeando los errores de campo a una lista de DatosErrorValidacion. Esto es una buena práctica, ya que proporciona detalles específicos sobre los errores de validación al cliente.

  4. Uso de Streams: El uso de streams para mapear los errores es una forma moderna y concisa de manejar colecciones en Java. Asegúrate de que tu entorno de desarrollo sea compatible con estas características de Java 8 o superior.

Aquí tienes un ejemplo de cómo podrías mejorar el código con los puntos mencionados:

@RestControllerAdvice
public class GestorDeErrores {

    @ExceptionHandler(EntityNotFoundException.class)
    public ResponseEntity<Void> gestionarError404() {
        return ResponseEntity.notFound().build();
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<List<DatosErrorValidacion>> gestionarError400(MethodArgumentNotValidException ex) {
        var errores = ex.getFieldErrors();
        return ResponseEntity.badRequest().body(errores.stream().map(DatosErrorValidacion::new).toList());
    }

    public record DatosErrorValidacion(String campo, String mensaje) {
        public DatosErrorValidacion(FieldError error){
            this(error.getField(), error.getDefaultMessage());
        }
    }
}

Espero que estas sugerencias te sean útiles. ¡Espero haber ayudado y buenos estudios!