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

В контроллере стоит @Valid @RequestBody CreateUserRequest, и клиент прислал невалидное тело. Что произойдёт по умолчанию?

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

Spring бросает MethodArgumentNotValidException, метод контроллера не вызывается, ответ по умолчанию — 400. Список ошибок полей нужно отдать клиенту через @RestControllerAdvice.

  • В Spring 6.1+ для параметров метода — HandlerMethodValidationException
  • Сломанный JSON — HttpMessageNotReadableException, тоже 400
  • ProblemDetail с массивом ошибок полей — удобный формат для клиента

А ещё BindingResult в параметрах метода отключает исключение — обрабатывать вручную

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

Подробно

Исключение обрабатывается встроенным механизмом и превращается в 400. Важное исключение из правила: если сразу после валидируемого аргумента объявить BindingResult, Spring не станет бросать исключение, а передаст ошибки в этот объект — и тогда проверять их обязан сам метод. Про 422 стоит сказать отдельно: строго по семантике он подходит для синтаксически корректного, но семантически неверного тела, однако умолчание Spring — именно 400, и менять его есть смысл только при сознательном решении по контракту API. Для единообразного формата ошибок используют @RestControllerAdvice и, начиная со Spring 6, ProblemDetail по RFC 7807.

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

  • Исключение и 400 без вызова метода.
  • Как вернуть ошибки полей.

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

  • Добавить BindingResult и забыть проверить его — валидация станет бесполезной.
  • Отдавать наружу сырое сообщение исключения со структурой DTO.

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

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

Показать варианты и ответ
  • ✓Будет брошено MethodArgumentNotValidException, и Spring вернёт 400 Bad Request
  • ✗Метод контроллера выполнится, а ошибки придётся проверять вручную
  • ✗Вернётся 500 Internal Server Error
  • ✗Вернётся 422 Unprocessable Entity

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

  • Как настроить единый формат ошибок валидации?
  • Что такое ProblemDetail и что он даёт клиентам?

Разбор темы

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

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

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

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

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