JSR 303: Cómo validar una colección de objetos anotados?
-
29-09-2019 - |
Pregunta
¿Es posible validar una colección de objetos en JSR 303 -? Jave Bean Validation donde la colección en sí no tiene ninguna anotación, pero los elementos contenidos en las tareas
Por ejemplo, es posible que este se traduzca en una violación de restricción debido a un nombre nulo en la segunda persona:
List<Person> people = new ArrayList<Person>();
people.add(new Person("dave"));
people.add(new Person(null));
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<List<Person>>> validation = validator.validate(people);
Solución
Sí, sólo tiene que añadir @Valid
a la colección.
Aquí es un ejemplo de el Validador de referencia Hibernate.
public class Car {
@NotNull
@Valid
private List<Person> passengers = new ArrayList<Person>();
}
Esta es la norma comportamiento JSR-303. Véase la sección 3.1.3 de la especificación .
Otros consejos
, puede también añadir @NotEmpty
a la colección.
public class Car {
@NotEmpty(message="At least one passenger is required")
@Valid
private List<Person> passengers = new ArrayList<Person>();
}
esto asegurará al menos un pasajero está presente, y la anotación @Valid
asegura que cada objeto Person
se valida
Puede, por supuesto, también acaba de iterar sobre la lista y llamar Validator.validate en cada elemento. O poner la lista en algún grano de envoltorio y anotar con @Valid. La extensión de ArrayList para la validación parece mal a mí. ¿Tiene un caso de uso particular que desea resolver con esto? Si es así tal vez se puede explicar un poco más. Para responder a su pregunta inicial:
¿Es posible validar una colección de objetos en JSR 303 - Jave Bean Validation donde el colección en sí no tiene ningún anotaciones pero los elementos contenidos dentro de hacer?
No
Me escribió esta clase genérica:
public class ValidListWrapper<T> {
@Valid
private List<T> list;
public ValidListWrapper(List<T> list) {
this.list = list;
}
public List<T> getList() {
return list;
}
}
Si está utilizando la biblioteca Jackson deserializar JSON se puede añadir una anotación @JsonCreator
en el constructor y Jackson será automáticamente deserializar matriz JSON al objeto envoltorio.