问题
Is it possible to validate a collection of objects in JSR 303 - Jave Bean Validation where the collection itself does not have any annotations but the elements contained within do?
For example, is it possible for this to result in a constraint violation due to a null name on the second person:
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);
回答1:
Yes, just add @Valid
to the collection.
Here is an example from the Hibernate Validator Reference.
public class Car {
@NotNull
@Valid
private List<Person> passengers = new ArrayList<Person>();
}
This is standard JSR-303 behavior. See Section 3.1.3 of the spec.
回答2:
You, can also add @NotEmpty
to the collection.
public class Car {
@NotEmpty(message="At least one passenger is required")
@Valid
private List<Person> passengers = new ArrayList<Person>();
}
this will ensure at least one passenger is present, and the @Valid
annotation ensures that each Person
object is validated
回答3:
You can of course also just iterate over the list and call Validator.validate on each element. Or put the List into some wrapper bean and annotate it with @Valid. Extending ArrayList for validation seems wrong to me. Do you have a particular use case you want to solve with this? If so maybe you can explain it a little more. To answer your initial question:
Is it possible to validate a collection of objects in JSR 303 - Jave Bean Validation where the collection itself does not have any annotations but the elements contained within do?
No
回答4:
I wrote this generic class:
public class ValidListWrapper<T> {
@Valid
private List<T> list;
public ValidListWrapper(List<T> list) {
this.list = list;
}
public List<T> getList() {
return list;
}
}
If you are using Jackson library to deserialize JSON you can add @JsonCreator
annotation on the constructor and Jackson will automatically deserialize JSON array to wrapper object.
回答5:
Both of these approaches work:
class MyDto {
private List<@Valid MyBean> beans;
}
or
class MyDto {
@Valid
private List<MyBean> beans;
}
来源:https://stackoverflow.com/questions/4106772/jsr-303-how-to-validate-a-collection-of-annotated-objects