JSR 303:如何验证带注释的对象的集合?

时间:2010-11-05 14:25:03

标签: java bean-validation hibernate-validator jsr

是否可以验证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);

5 个答案:

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