Перейти к основному содержимому

Использование Spring @ResponseStatus для установки кода состояния HTTP

· 2 мин. чтения

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 .