JSR 303:如何validation注释对象的集合?

是否有可能validationJSR 303 – Jave Bean Validation中的对象集合,其中集合本身没有任何注释,但包含的元素是做什么的?

例如,是否有可能由于第二个人的空名称而导致违反约束:

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); 

是的,只需在集合中添加@Valid

这里是一个来自Hibernate Validator Reference 的例子 。

 public class Car { @NotNull @Valid private List<Person> passengers = new ArrayList<Person>(); } 

这是标准的JSR-303行为。 参见规范的第3.1.3节。

您也可以将@NotEmpty添加到集合中。

 public class Car { @NotEmpty(message="At least one passenger is required") @Valid private List<Person> passengers = new ArrayList<Person>(); } 

这将确保至less有一个乘客存在,并@Valid注释确保每个Person对象被validation

你当然也可以迭代列表并在每个元素上调用Validator.validate。 或者把List放入一些包装bean中,并用@Valid对它进行注释。 扩展ArrayList进行validation对我来说似乎是错误的。 你有一个特定的用例,你想解决这个问题? 如果是这样,也许你可以多解释一下。 回答你最初的问题:

是否有可能validationJSR 303 – Jave Bean Validation中的对象集合,其中集合本身没有任何注释,但包含的元素是做什么的?

没有

我写了这个generics类:

 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数组反序列化为包装对象。