Здравствуйте!
Как работает валидация композиций?
Создаю сущность с композицией. Ставлю через студию валидацию @NotNull на поля сущности. На экране редактирования валидация на композиции не работает, т.е. таблица с элементами пустая, но сущность сохраняется. Аналогично не работает аннотация @Size.
Попробуйте @NotEmpty.
Ярослав, здравствуйте! Всё ещё бьёмся над неработающими аннотациями. @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;
}
Как видно из исходного кода - полученные результаты валидации фильтруются по типу. Вполне можете этот кусок переопределить.