Почему @Valid на DTO не проверяет вложенный объект

Вопрос выглядит просто: у OrderRequest есть поле @Valid AddressDto address, но при пустом городе валидация проходит, будто поля не существует.

Bean Validation каскадирует только там, где это явно указано. @Valid на поле — не рекурсивный обход всего графа объектов, а разрешение провалиться внутрь конкретного поля. Если внутри AddressDto забыли @NotBlank на city, никто его не проверит, даже если сам DTO помечен @Valid снаружи.

Отдельная ловушка — коллекции. @Valid List items каскадирует на каждый элемент списка, но только с корректной поддержкой Bean Validation 2.0 в стеке. На старых версиях список пройдёт валидацию контейнера, но не элементов.

public class OrderRequest { @NotNull private String id;

@Valid private AddressDto address;

@Valid private List items; }

Спросят следом: как валидировать DTO на разных этапах — при создании и при обновлении, если часть полей обязательна только в одном случае. Ответ — группы валидации (@NotNull(groups = OnCreate.class)) и явный @Validated(OnCreate.class) на контроллере, а не дублирование класса ради одного поля.

Каскад в Bean Validation — явное решение на каждом уровне графа, а не свойство самого графа.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки