Использование 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.