@NotNull对JSR-303验证的澄清

时间:2018-01-03 14:11:21

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

我有一个用JSR-303注释注释的POJO。它的一些属性是其他POJO。 我希望内部POJO是@Valid,只要它们不是null。但如果它们为空则可以。 不幸的是,我没有成功这样做,所以如果它们为空,Java会返回内部POJO属性的错误。

@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不为null且attributeB为null;
  2. attributeB不为null且attributeB不为null且有效。
  3. 所以我希望只有在内部pojo不为null时才能尊重内部pojo属性的约束。

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

1 个答案:

答案 0 :(得分:1)

添加@Valid应该是有效的,如果不是null。 JSR 303:Bean Validation规范的Section 3.5.1在验证对象图时说“忽略空引用”。

我使用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());
        }
    }
}
相关问题