4

有一个@NotNull注释可以验证某个对象不为空。

有一个@NotEmpty注释可以验证某个集合/地图/字符串/...不是空的。

是否还有一个注释可以验证某个集合/地图不包含任何空值?我找不到它。它看起来很基础,我相信它一定在 JSR-303 规范中。

4

3 回答 3

12

Bean 验证 2.0/Hibernate 验证器 6.0

Bean Validation 2.0(其中 Hibernate Validator 6.0 是参考实现)允许直接在泛型类型参数上使用其验证注释。这在Hibernate 6.0 版本文档中有所说明:

Hibernate Validator 6.0 是 Bean Validation 2.0 规范的参考实现,因此它具有所有新特性:

  • 对容器元素约束和级联验证的一流支持(想想private Map<@Valid @NotNull OrderCategory, List<@Valid @NotNull Order>> orderByCategories;);

如果项目使用带有 Bean Validation 2.0 的 Java 8,则可以使用此功能来实现您的既定目标:

List<@NotNull String> noNullsList;
Map<@NotNull String, @NotNull String> noNullKeysOrValuesMap;

Bean 验证 1.2/Hibernate 验证器 5.2

Hibernate 5.2(带有 Bean Validation 1.2)添加了该功能的有限版本,以允许直接在泛型类型参数上进行验证注释。但是,它的内置 Bean Validation 或 Hibernate Validation 约束都不能以这种方式使用,因为注释没有指定ElementType.TYPE_USE向后兼容的原因。此外,可以为映射值而不是映射键指定类型参数约束。这在Hibernate Validator 5.2 文档中都有描述:

从 Java 8 开始,可以直接在参数化类型的类型参数上指定约束。但是,这需要在约束定义ElementType.TYPE_USE中指定。@Target为了保持向后兼容性,内置 Bean Validation 以及 Hibernate Validator 特定约束尚未指定ElementType.TYPE_USE.

[...]

当对 Iterable 类型参数应用约束时,Hibernate Validator 将验证每个元素。

[...]

类型参数约束也针对映射值进行验证。忽略键上的约束。

概括

总之,如果您使用 Java 8 和 Bean Validation 2.0(例如 Hibernate Validator 6),您可以使用@NotNull.

如果您将 Java 8 与 Bean Validation 1.2 和 Hibernate Validator 5.2 一起使用,则可以在其定义中编写自定义@NotNull验证注释TYPE_USE,并将其应用于集合或映射值的泛型类型。

如果您不是在 Java 8 上或在 5.2 之前的 Hibernate Validator 版本上,则需要自定义约束来应用到映射或列表,以验证集合或映射的每个元素都是非空的。

于 2015-11-02T15:41:51.470 回答
2

没有这样的内置约束。您可以轻松编写自定义约束,例如@NoNullElements,它可以满足您的需求。请参阅参考文档http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#validator-customconstraints了解如何编写自定义约束。

于 2015-01-19T20:00:18.583 回答
0

我有同样的问题。我找到的唯一解决方案是在实体的设置器中添加一个空验证。如果提交的值为 null -> 返回。我知道那很丑陋,但我知道如何避免异常的唯一方法。

于 2015-01-16T12:58:40.010 回答