50

是否可以在 JSR 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);
4

5 回答 5

67

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

这是Hibernate Validator Reference 中的一个示例

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

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

于 2011-08-21T03:32:01.993 回答
22

你,也可以添加@NotEmpty到收藏中。

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

这将确保至少有一名乘客在场,并且@Valid注释确保每个Person对象都经过验证

于 2012-03-13T11:25:28.413 回答
3

当然,您也可以只遍历列表并在每个元素上调用 Validator.validate。或者将列表放入一些包装器 bean 中并使用 @Valid 对其进行注释。扩展 ArrayList 进行验证对我来说似乎是错误的。您是否有想要解决此问题的特定用例?如果是这样,也许您可​​以再解释一下。要回答您最初的问题:

是否可以在 JSR 303 - Jave Bean Validation 中验证集合本身没有任何注释但其中包含的元素的对象集合?

于 2010-11-07T12:36:36.823 回答
2

从 Bean Validator 2.0 开始,这两种方法都有效:

class MyDto {

    private List<@Valid MyBean> beans;
}

class MyDto {

    @Valid
    private List<MyBean> beans;
}
于 2019-10-20T09:00:03.413 回答
0

我写了这个通用类:

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

于 2016-08-02T08:51:41.993 回答