Bean 验证 2.0/Hibernate 验证器 6.0
Bean Validation 2.0(其中 Hibernate Validator 6.0 是参考实现)允许直接在泛型类型参数上使用其验证注释。这在Hibernate 6.0 release documentation 中注明:
Hibernate Validator 6.0 是 Bean Validation 2.0 规范的参考实现,因此它具有所有新功能:
- 对容器元素约束和级联验证的一流支持(想想
private Map<@Valid @NotNull OrderCategory, List<@Valid @NotNull Order>> orderByCategories;);
如果项目使用 Java 8 和 Bean Validation 2.0,则可以使用此功能来验证列表中的每个元素:
private List<@NotNull String> myString; // Validate that none of the list items is null
Bean 验证 1.2/Hibernate 验证器 5.2
Hibernate 5.2(带有 Bean Validation 1.2)添加了该功能的受限版本,以允许直接在泛型类型参数上进行验证注释。但是,它的内置 Bean Validation 或 Hibernate Validation 约束都不能以这种方式使用,因为由于向后兼容的原因,注释没有指定 ElementType.TYPE_USE。此外,可以为映射值而不是映射键指定类型参数约束。这在Hibernate Validator 5.2 documentation中都有描述:
从 Java 8 开始,可以直接在参数化类型的类型实参上指定约束。但是,这需要在约束定义中通过@Target 指定ElementType.TYPE_USE。为了保持向后兼容性,内置 Bean Validation 以及 Hibernate Validator 特定约束尚未指定 ElementType.TYPE_USE。
[...]
当对 Iterable 类型参数应用约束时,Hibernate Validator 将验证每个元素。
[...]
类型参数约束也会针对映射值进行验证。忽略键上的约束。
总结
总而言之,如果代码使用 Java 8 和 Bean Validation 2.0(例如 Hibernate Validator 6),则可以对泛型列表和映射类型参数进行注解:
private List<@NotNull String> myString;
如果代码使用带有 Bean Validation 1.2 和 Hibernate Validator 5.2 的 Java 8,则可以在其定义中使用 TYPE_USE 编写自定义验证注释,并将其应用于集合或映射值的泛型类型:
private List<@MyCustomNotNull String> myString;
如果代码未使用 Java 8 或在 5.2 之前的 Hibernate Validator 版本上,则可以编写自定义约束来验证集合或映射的每个元素并将其应用于集合或映射本身。
@MyCustomNotNullElements
private List<String> myString;