@NotNull 对 JSR-303 验证的说明

@NotNull clarification for JSR-303 validation

我有一个带有 JSR-303 注释的 POJO。它的一些属性是其他 POJO。 我希望内部 POJO 为@Valid,前提是它们不为空。但是,如果它们为空,那也没关系。 不幸的是,我没有成功这样做,所以 Java returns 如果内部 POJOs 属性为 null,则将错误告诉我。

@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;
}

如果满足以下条件,我希望 outerPojo 有效:

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

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

我试过将 @Nullable 添加到 attributeB 但没有效果。 我该如何解决?

只需添加@Valid 就意味着如果不为空则有效。 JSR 303 的 Section 3.5.1:Bean 验证规范在验证对象图时说 "Null references are ignored"。

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

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());
        }
    }
}