Получить доступ

Как в Spring MVC обычно обрабатывают ошибки и валидацию входных DTO?

MiddleВалидация и обработка ошибокSpring
Ещё спрашивают так:
  • Как валидировать входные данные REST API в Spring?
Коротко

Ограничения — аннотациями Bean Validation на полях DTO (@NotBlank, @Email, @Size, @Positive), проверка — **@Valid на параметре контроллера, ошибки — в @RestControllerAdvice** в едином формате (ProblemDetail с полями).

  • Нужна зависимость spring-boot-starter-validation (Hibernate Validator)
  • Невалидное тело → MethodArgumentNotValidException → 400
  • Вложенные объекты — @Valid на поле; списки — List<@Valid Item>

А ещё Бизнес-правила (уникальность email) — в сервисе, а не аннотацией

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Объявление правил:

public record CreateUserRequest(
    @NotBlank @Size(max = 80) String name,
    @NotBlank @Email String email,
    @Valid @NotNull AddressDto address,
    @Size(max = 10) List<@NotBlank String> tags) {}

Проверка: @PostMapping ... create(@Valid @RequestBody CreateUserRequest req). При нарушении Spring бросает MethodArgumentNotValidException (для @RequestBody) или HandlerMethodValidationException (Spring 6.1+, для параметров метода); по умолчанию — 400.

Единый ответ: в @RestControllerAdvice превращать MethodArgumentNotValidException в ProblemDetail со списком ошибок полей (field, message), чтобы клиент мог подсветить их в форме.

Группы и параметры: @Validated(OnCreate.class) — разные правила для создания и изменения; @Validated на классе сервиса — проверка параметров методов (@NotNull, @Min на аргументах).

Где граница: аннотации — для формата и обязательности. Правила, требующие данных (email уже занят, товар закончился), — в сервисе с понятным исключением (409, 422). Свои ограничения — аннотация + ConstraintValidator.

Что хотят услышать

  • Аннотации на DTO и @Valid.
  • Исключение и обработка в едином формате.
  • Вложенные объекты, группы.
  • Граница между валидацией формата и бизнес-правилами.

Частые ошибки

  • Забыть стартер validation — аннотации молча не работают.
  • Проверять уникальность аннотацией с запросом в базу.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓@Valid запускает Bean Validation (ошибка → 400), а единый @RestControllerAdvice формирует контракт ошибки (ProblemDetail)
  • ✗Ловить исключения в каждом методе вручную
  • ✗Возвращать 200 OK с текстом ошибки
  • ✗Валидацию писать в SQL-триггерах

Что спросят дальше

  • Чем @Valid отличается от @Validated?
  • Как вернуть field errors?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем