Почему @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 — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки