我有一个用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有效:
所以我希望只有在内部pojo不为null时才能尊重内部pojo属性的约束。
我尝试将@Nullable添加到attributeB但没有效果。 我该如何解决这个问题?
答案 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());
}
}
}