是否可以验证JSR 303中的对象集合 - Jave Bean Validation,其中集合本身没有任何注释但是包含在do中的元素?
例如,是否可能由于第二个人的空名称而导致约束违规:
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);
答案 0 :(得分:61)
是的,只需将@Valid
添加到集合中即可。
这是来自Hibernate Validator Reference的an example。
public class Car {
@NotNull
@Valid
private List<Person> passengers = new ArrayList<Person>();
}
这是标准的JSR-303行为。参见spec的3.1.3节。
答案 1 :(得分:20)
您也可以将@NotEmpty
添加到集合中。
public class Car {
@NotEmpty(message="At least one passenger is required")
@Valid
private List<Person> passengers = new ArrayList<Person>();
}
这将确保至少有一位乘客在场,@Valid
注释确保每个Person
对象都经过验证
答案 2 :(得分:2)
您当然也可以遍历列表并在每个元素上调用Validator.validate。或者将List放入一些包装bean并使用@Valid注释它。扩展ArrayList以进行验证对我来说似乎不对。 你有一个特定的用例要用这个来解决吗?如果是这样,也许你可以解释一下。回答你的初步问题:
是否可以验证a JSR 303中的对象集合 - Jave Bean验证在哪里 集合本身没有任何 注释,但包含的元素 在做什么?
没有
答案 3 :(得分:0)
这两种方法均有效:
class MyDto {
private List<@Valid MyBean> beans;
}
或
class MyDto {
@Valid
private List<MyBean> beans;
}
答案 4 :(得分:-1)
我写了这个通用类:
public class ValidListWrapper<T> {
@Valid
private List<T> list;
public ValidListWrapper(List<T> list) {
this.list = list;
}
public List<T> getList() {
return list;
}
}
如果您使用Jackson库反序列化JSON,可以在构造函数上添加@JsonCreator
注释,Jackson会自动将JSON数组反序列化为包装器对象。