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

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

1. Вступление

В Spring MVC у нас есть много способовset the status code of an HTTP response.

В этом коротком руководстве мы увидим самый простой способ: использовать аннотацию@ResponseStatus.

2. О методах контроллера

Когда конечная точка успешно возвращается, Spring предоставляет ответ HTTP 200 (ОК).

Если мы хотим указатьresponse status of a controller method, мы можем отметить этот метод с помощью@ResponseStatus.. Он имеет два взаимозаменяемых аргумента для желаемого статуса ответа:code, иvalue.. Например, мы можем indicate that the server refuses to brew coffee because it is a teapot:

@ResponseStatus(HttpStatus.I_AM_A_TEAPOT)
void teaPot() {}

Когда мы хотим сообщить об ошибке, мы можем предоставить сообщение об ошибке с помощью аргументаreason:

@ResponseStatus(HttpStatus.BAD_REQUEST, reason = "Some parameters are invalid")
void onIllegalArgumentException(IllegalArgumentException exception) {}

Обратите внимание, что когда мы устанавливаемreason, Spring вызываетHttpServletResponse.sendError(). Следовательно, он отправитHTML error page to the client, which makes it a bad fit for REST endpoints.

Также обратите внимание, что Spring использует только@ResponseStatus, когдаthe marked method completes successfully (без выбросаException).

3. С обработчиками ошибок

У нас есть три способа использовать@ResponseStatus для преобразованияException в статус ответа HTTP:

  • используя@ExceptionHandler

  • используя@ControllerAdvice

  • маркировка классаException

Чтобы использовать первые два решения, мы должны определить метод обработчика ошибок. Вы можете прочитать больше по этой теме вthis article.

Мы можем использовать@ResponseStatus с этими методами обработчика ошибокthe same way we did with regular MVC methods в предыдущем разделе.

Когда нам не нужны динамические ответы об ошибках, наиболее простое решение - третье: пометить класс Exception с помощью@ResponseStatus:

@ResponseStatus(code = HttpStatus.BAD_REQUEST)
class CustomException extends RuntimeException {}

Когда Spring ловит этотException, он использует настройки, которые мы предоставили в@ResponseStatus.

Обратите внимание: когда мы отмечаем классException с помощью@ResponseStatus, Spring всегда вызываетHttpServletResponse.sendError(),, независимо от того, устанавливаем ли мыreason или нет.

Также обратите внимание, что Spring использует ту же конфигурацию для подклассов, если мы тоже не помечаем их@ResponseStatus.

4. Заключение

В этой статье мы увидели, как мы можем использовать@ResponseStatus для установки кода ответа HTTP в различных сценариях, включая обработку ошибок.

Как обычно доступны примерыover on GitHub.