澄清@NotNull对JSR 303的验证

问题描述 投票:1回答:1

我有一个用JSR-303注释注释的POJO。它的一些属性是其他POJO。我希望内部POJO是@Valid,只要它们不是null。但如果它们为空则可以。不幸的是,我没有成功这样做,所以如果它们为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且有效。

所以我希望只有在内部pojo不为null时才能尊重内部pojo属性的约束。

我已经尝试将@Nullable添加到attributeB而没有任何效果。我怎么解决这个问题?

java validation hibernate-validator spring-framework-beans annotated-pojos
1个回答
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());
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.