В контроллере стоит @Valid @RequestBody CreateUserRequest, и клиент прислал невалидное тело. Что произойдёт по умолчанию?
- Что вернёт 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 и что он даёт клиентам?
Разбор темы
- Валидация и обработка ошибок
Bean Validation и @Valid/@Validated, превращение ошибок в ответ, @ControllerAdvice и единый контракт, ProblemDetail (RFC 7807), multipart и interceptors.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.