java - JSR-303 验证的@NotNull 说明

标签 java validation hibernate-validator spring-framework-beans annotated-pojos

我有一个带有 JSR-303 注释的 POJO。它的一些属性是其他 POJO。 我希望内部 POJO 为 @Valid,前提是它们不为空。但如果它们为空,那就没问题了。 不幸的是,我没有成功地做到这一点,因此如果内部 POJO 属性为 null,Java 就会向我返回错误。

@AllArgsConstructor @NoArgsConstructor @Data
class OuterPojo{
    @NotBlank private String attributeA;
    @Valid    private InnerPojo attributeB;
}

@AllArgsConstructor @NoArgsConstructor @Data
class InnerPojo{
    @NotBlank private String attributeC;
    @NotNull  private Double attributeD;
}

我希望 externalPojo 在以下情况下有效:

  1. attributeA 不为 null,attributeB 为 null;
  2. attributeB 不为空且 attributeB 不为空且有效。

因此,我希望仅当内部 pojo 不为 null 时,才遵守对内部 pojo 属性的约束。

我尝试将 @Nullable 添加到 attributeB 但没有效果。 我该如何解决这个问题?

最佳答案

只要添加 @Valid 就意味着如果不为 null 则有效。 Section 3.5.1 JSR 303:Bean Validation 规范规定在验证对象图时“忽略空引用”。

我使用 Hibernate Validator 6.0.2.Final 和这个简单的测试类验证了这一点。

public class Main {
    public static void main(String[] args) {
        OuterPojo outer = new OuterPojo("some value", null);
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator v = factory.getValidator();
        Set<ConstraintViolation<OuterPojo>> errors = v.validate(outer);
        for (ConstraintViolation<OuterPojo> violation : errors) {
            System.out.println(violation.getMessage());
        }
    }
}

关于java - JSR-303 验证的@NotNull 说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48079067/

相关文章:

Java、Maven 依赖项

java - 确定类和属性约束 JSR303 bean 验证

cdi - 当包含在 WAR 文件部署中的 JodaTime v. 2.5 库失败时

ruby-on-rails - 如何测试自定义验证器?

java - javax.validation.constraints 中的转义序列无效

java - 拦截MainActivity中Fragment Dialog的Ok按钮点击

java - 如何从JList中选择多个项目并将它们保存到java中单列的MySQL数据库中

java - 从本地网络连接到 Red5 服务器

java - 仅当其他字段为 false 时才验证字段

php - Ajax 代码将表单数据发送到 PHP 服务器进行验证