1

我有一个带有 JSR-303 注释的 POJO。它的一些属性是其他 POJO。我希望内部 POJO 为 @Valid,前提是它们不为空。但如果它们为空,那也没关系。不幸的是,我没有成功执行此操作,因此如果内部 POJO 属性为空,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;
}

在以下情况下,我希望 outerPojo 有效:

  1. 属性A 不为空且属性B 为空;
  2. attributeB 不为空且attributeB 不为空且有效。

因此,我希望仅当内部 pojo 不为空时才尊重对内部 pojo 属性的约束。

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

4

1 回答 1

1

只需添加 @Valid 应该意味着如果不为 null 则有效。JSR 303 的第 3.5.1 节:Bean 验证规范在验证对象图时说“忽略空引用”。

我使用 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());
        }
    }
}
于 2018-01-03T14:43:25.407 回答