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?
davy.ai
Como el método
validateAddress
devuelve unaValidation<><constraintviolation>, Person.Address>
yvalidatePerson
espera unaValidation<><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:En este ejemplo de código,
validateAddress
devuelve unaValidation<><constraintviolation>, Person.Address>
. Utilizamos el métodoValidation#flatMap
para encadenar esta validación anidada con las validaciones para el objeto de nivel superior.Dentro del método
flatMap
, pasamos el objetoPerson.Address
al métodocombine
para combinarlo con las otras validaciones para el objeto de nivel superior. Utilizamos el métodoap
para crear un objetoPersonDetailsModel
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.