如何在数组/列表/集合的元素上使用Java Bean Validators(JSR-303/JSR-349)

Eri*_* B. 6 java validation bean-validation

我是新手使用Java Bean验证(JSR-303/JSR-349/Hibernate Validator),并了解一般概念.但是,我不确定如何验证组合类型的内容与类型本身.

例如:

@NotNull
private List<String> myString;
Run Code Online (Sandbox Code Playgroud)

将验证List myString不为null,但不验证列表本身的内容.或者给出其他类型的验证器(Min/Max/etc),如何验证List的各个元素?是否有任何组合类型的通用解决方案?

Gun*_*nar 5

从Bean Validation 1.0/1.1开始,没有简单的通用解决方案.您可以实现自定义约束,如@NoNullElements:

@NoNullElements
private List<String> myStrings;
Run Code Online (Sandbox Code Playgroud)

约束的验证器将遍历列表并检查没有元素为空.另一种方法是将String包装为更特定于域的类型:

public class EmailAddress {

    @NotNull
    @Email
    private String value;

    //...
}
Run Code Online (Sandbox Code Playgroud)

并通过@Valid以下方式将级联验证应用于列表:

@Valid
private List<EmailAddress> addresses;
Run Code Online (Sandbox Code Playgroud)

拥有这种特定于域的数据类型通常有助于在数据元素通过应用程序时传达数据元素的含义.

将来,该问题的通用解决方案可能是在Java 8支持的类型参数上使用注释,但这只是一个想法:

private List<@NotNull String> myStrings;
Run Code Online (Sandbox Code Playgroud)