Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
2
respuestas

Haga lo que aprendimos en aula en el aula:

package med.voll.api.infra;

import jakarta.persistence.EntityNotFoundException;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GestorDerErrores {

/*
@ExceptionHandler me permite manejar excepciones específicas
 que se lancen durante la ejecución de los controladores REST.
En este caso, estamos manejando dos tipos de excepciones:
1. EntityNotFoundException: Cuando se lanza esta excepción,
   el metodo getionarError404() devuelve una respuesta HTTP 404 Not Found.
2. MethodArgumentNotValidException: Cuando se lanza esta excepción,
   el metodo getionarError400() devuelve una respuesta HTTP 400 Bad Request
 */
@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());
    }
}

}

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

2 respuestas

Hola, Alexis, espero estés bien

Parece que estás implementando una clase para manejar excepciones en un controlador REST usando @RestControllerAdvice. Tu código parece correcto, pero asegúrate de que la clase DatosErrorValidacion está bien definida como un record, lo que parece ser el caso.

Aquí hay algunas cosas que podrías revisar o mejorar:

  1. Importaciones: Asegúrate de que todas las importaciones necesarias están presentes y correctas. Especialmente para FieldError y las clases de excepción.

  2. Nombres de Métodos: Verifica que los nombres de los métodos (getionarError404 y getionarError400) sean consistentes con tu convención de nombres. Podrías considerar usar gestionarError404 y gestionarError400 si es un error tipográfico.

  3. Retorno de Tipos Genéricos: Puedes especificar un tipo genérico para ResponseEntity, por ejemplo, ResponseEntity<Void> para getionarError404 y ResponseEntity<List<DatosErrorValidacion>> para getionarError400.

  4. Pruebas: Asegúrate de probar estas excepciones para verificar que el manejo funciona como esperas.

Aquí tienes un ejemplo de cómo podrías ajustar el código:

@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 esto te ayude y buenos estudios!

gracias