es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

vavr añade validaciones anidadas con combinación de validaciones.

Tengo un objeto de entrada como:

class Persona {

    private String nombre;
    private String correoElectronico;
    private String telefono;
    private Direccion direccion;

    public static class Direccion {

        private String ciudad;
        private String codigoPostal;
        private String calle;
        private DetallesDireccion detallesDireccion;

        public static class DetallesDireccion {

            private String estado;
            private String pais;

        }
    }
}

Estoy usando Validaciones de Vavr para validar la entrada.

public static Validation<Seq<ConstraintViolation>, ModeloDetallesPersona> validatePerson(SolicitudDetallesPersona solicitud) {
    Validation
        .combine(
            validateName("nombre", solicitud.getNombre()),
            validateEmail("correoElectronico", solicitud.getCorreoElectronico()),
            validatePhone("telefono", solicitud.getTelefono()),
            validateAddress(solicitud.getDireccion())
        ).ap((nombre, correoElectronico, telefono, direccion) -> new ModeloDetallesPersona(nombre, correoElectronico, telefono, direccion);
}

public static Validation<Seq<ConstraintViolation>, Persona.Direccion> validateAddress(
  Persona.Direccion solicitud) {

     return Validation
        .combine(..
        ).ap((..) -> new Persona.Direccion(..);

}

En la segunda función, devuelve una Seq de ConstraintViolation mientras que validatePerson espera solo ConstraintViolation, por eso está fallando aunque tengo que agregar un nivel más de anidamiento de validaciones para DetallesDireccion. ¿Cómo manejar las validaciones de objetos anidados con este enfoque?

No estoy seguro de cómo proceder ¿Qué debo hacer?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como el método validateAddress devuelve una Validation<><constraintviolation>, Person.Address> y validatePerson espera una Validation<><constraintviolation>, PersonDetailsModel>, es necesario transformar la validación anidada para que sea compatible con la validación de nivel superior.

    Esto se puede lograr utilizando el método Validation#flatMap para encadenar las validaciones. Aquí hay un ejemplo:

    public static Validation<><constraintviolation>, PersonDetailsModel> validatePerson(PersonDetailsRequest request) {
        return validateAddress(request.getAddress())
                .flatMap(address -> Validation.combine(
                        validateName("name", request.getName()),
                        validateEmail("email", request.getEmail()),
                        validatePhone("phone", request.getPhone())
                ).ap((name, email, phone) -> new PersonDetailsModel(name, email, phone, address)));
    }
    

    En este ejemplo de código, validateAddress devuelve una Validation<><constraintviolation>, Person.Address>. Utilizamos el método Validation#flatMap para encadenar esta validación anidada con las validaciones para el objeto de nivel superior.

    Dentro del método flatMap, pasamos el objeto Person.Address al método combine para combinarlo con las otras validaciones para el objeto de nivel superior. Utilizamos el método ap para crear un objeto PersonDetailsModel combinando los campos validados con la dirección validada.

    Al encadenar las validaciones de esta manera, puedes manejar las validaciones de objetos anidados con el enfoque que estás utilizando.

Comments are closed.