Вопрос с собеседования · Spring

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования