1. Введение
В Spring MVC у нас есть много способов установить код состояния HTTP-ответа .
В этом коротком руководстве мы увидим самый простой способ: использование аннотации @ResponseStatus
.
2. О методах контроллера
Когда конечная точка успешно возвращается, Spring предоставляет ответ HTTP 200 (ОК).
Если мы хотим указать статус ответа метода контроллера , мы можем пометить этот метод с помощью @ResponseStatus.
Он имеет два взаимозаменяемых аргумента для желаемого состояния ответа: код
и значение.
Например, мы можем указать, что сервер отказывается варить кофе, потому что это чайник :
@ResponseStatus(HttpStatus.I_AM_A_TEAPOT)
void teaPot() {}
Когда мы хотим сообщить об ошибке, мы можем предоставить сообщение об ошибке через аргумент
Reason:
@ResponseStatus(HttpStatus.BAD_REQUEST, reason = "Some parameters are invalid")
void onIllegalArgumentException(IllegalArgumentException exception) {}
Обратите внимание, что когда мы устанавливаем причину
, Spring вызывает HttpServletResponse.sendError()
. Поэтому он отправляет клиенту HTML-страницу с ошибкой, что делает его плохо подходящим для конечных точек REST .
Также обратите внимание, что Spring использует @ResponseStatus
только тогда , когда отмеченный метод завершается успешно (без создания исключения
).
3. С обработчиками ошибок
У нас есть три способа использования @ResponseStatus
для преобразования Exception
в статус ответа HTTP:
- используя
@ExceptionHandler
- используя
@ControllerAdvice
- маркировка класса
Exception
Чтобы использовать первые два решения, мы должны определить метод обработчика ошибок. Подробнее об этой теме вы можете прочитать в этой статье .
Мы можем использовать @ResponseStatus
с этими методами обработчика ошибок так же, как и с обычными методами MVC в предыдущем разделе.
Когда нам не нужны динамические ответы об ошибках, самым простым решением является третье: пометить класс Exception с помощью @ResponseStatus:
@ResponseStatus(code = HttpStatus.BAD_REQUEST)
class CustomException extends RuntimeException {}
Когда Spring перехватывает это исключение
, он использует настройки, которые мы указали в @ResponseStatus
.
Обратите внимание, что когда мы помечаем класс Exception с помощью
@ResponseStatus
, Spring всегда вызывает HttpServletResponse.sendError() независимо от того
,
установили мы причину
или нет.
Также обратите внимание, что Spring использует ту же конфигурацию для подклассов, если только мы не пометим их также с помощью @ResponseStatus
.
4. Вывод
В этой статье мы увидели, как можно использовать @ResponseStatus
для установки кода ответа HTTP в различных сценариях, включая обработку ошибок.
Как обычно, примеры доступны на GitHub .