@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 был действительным, если:

  1. attributeA не является нулевым, а attributeB является нулевым;
  2. 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());
        }
    }
}
Другие вопросы по тегам