Валидация композиции

Здравствуйте!
Как работает валидация композиций?
Создаю сущность с композицией. Ставлю через студию валидацию @NotNull на поля сущности. На экране редактирования валидация на композиции не работает, т.е. таблица с элементами пустая, но сущность сохраняется. Аналогично не работает аннотация @Size.

Попробуйте @NotEmpty.

1 симпатия

Ярослав, здравствуйте! Всё ещё бьёмся над неработающими аннотациями. @NotEmpty - абсолютно здравая мысль, но почему-то тоже не работает. Более того, кастомный валидатор тоже, видимо, попросту игнорируется (в метод isValid() не заходит). Может, где-то есть какие-то дополнительные настройки, связанные с валидацией коллекций, которые заставляют фреймворк игнорировать их?

Скорее всего вам придется добавить EntitySavingEvent. Выкидывать там ошибку ValidationException или сделать свой Exception для таких случаев. и добавить обработчик AbstractUiExceptionHandler

Да, спасибо, сейчас похожим образом и сделали (через onValidate), но это как-то неизящно.

Вся проблема в методе validateCrossFieldRules бина ScreenValidation

public ValidationErrors validateCrossFieldRules(@SuppressWarnings("unused") @Nullable FrameOwner origin, Object item) {
        ValidationErrors errors = new ValidationErrors();

        Set<ConstraintViolation<Object>> violations = validator.validate(item, UiCrossFieldChecks.class);

        violations.stream()
                .filter(violation -> {
                    Path propertyPath = violation.getPropertyPath();

                    Path.Node lastNode = Iterables.getLast(propertyPath);
                    return lastNode.getKind() == ElementKind.BEAN;
                })
                .forEach(violation -> errors.add(violation.getMessage()));

        return errors;
    }

Как видно из исходного кода - полученные результаты валидации фильтруются по типу. Вполне можете этот кусок переопределить.

1 симпатия