@NotNull разъяснение для проверки JSR-303
У меня есть POJO с аннотациями JSR-303. Некоторые из его атрибутов - это другие POJO. Я хотел бы, чтобы внутренние POJO были @Valid, только если они не нулевые. Но если они нулевые, все в порядке. К сожалению, мне не удается это сделать, поэтому Java возвращает мне ошибку для внутреннего атрибута POJOs, если они нулевые.
@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;
}
Я хочу, чтобы externalPojo был действительным, если:
- attributeA не является нулевым, а attributeB является нулевым;
- attributeB не является нулевым, а attributeB не является нулевым и допустимым.
Поэтому я хотел бы, чтобы ограничения на атрибуты внутреннего pojo уважались, только если внутреннее pojo не равно нулю.
Я попытался добавить @Nullable к attributeB без эффекта. Как я могу решить это?
1 ответ
Просто добавление @Valid должно означать действительный, если не ноль. Раздел 3.5.1 спецификации JSR 303: Bean Validation гласит: "Пустые ссылки игнорируются" при проверке графа объекта.
Я проверил это, используя 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());
}
}
}