Возвращение пользовательских кодов состояния из контроллеров Spring

Возврат пользовательских кодов состояния из контроллеров Spring

1. обзор

Эта быстрая статья продемонстрирует несколько способовreturn custom HTTP status codes from Spring MVC controllers.

Это часто важно для того, чтобы более четко выразить результат запроса клиенту и использовать полную расширенную семантику протокола HTTP. Например, если что-то пойдет не так с запросом, отправка конкретного кода ошибки для каждого типа возможной проблемы позволит клиенту отобразить соответствующее сообщение об ошибке пользователю.

Настройка базового проекта Spring MVC выходит за рамки этой статьи, но вы можете найти дополнительную информациюhere.

2. Возврат пользовательских кодов статуса

Spring предоставляет несколько основных способов возврата пользовательских кодов состояния из классовController:

  • используяResponseEntity

  • используя аннотацию@ResponseStatus для классов исключений, и

  • используя аннотации@ControllerAdvice и@ExceptionHandler.

Эти параметры не являются взаимоисключающими; отнюдь нет, они могут дополнять друг друга.

В этой статье будут рассмотрены первые два способа (ResponseEntity и@ResponseStatus). Если вы хотите узнать больше об использовании@ControllerAdvice и@ExceptionHandler, вы можете прочитать об этомhere.

2.1. Возврат кодов состояния черезResponseEntity

В стандартном контроллере Spring MVC мы определим простое отображение:

@RequestMapping(value = "/controller", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity sendViaResponseEntity() {
    return new ResponseEntity(HttpStatus.NOT_ACCEPTABLE);
}

При получении запроса GET к «/controller» Spring вернет ответ с кодом 406 (неприемлемо). Мы произвольно выбрали конкретный код ответа для этого примера. Вы можете вернуть любой код статуса HTTP (полный список можно найтиhere).

2.2. Возврат кодов состояния через исключение

Мы добавим в контроллер второй метод, чтобы продемонстрировать, как использоватьException для возврата кода состояния:

@RequestMapping(value = "/exception", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity sendViaException() {
    throw new ForbiddenException();
}

После получения запроса GET к «/exception» Spring выдастForbiddenException. Это пользовательское исключение, которое мы определим в отдельном классе:

@ResponseStatus(HttpStatus.FORBIDDEN)
public class ForbiddenException extends RuntimeException {}

В этом исключении код не требуется. Вся работа проделана аннотацией@ResponseStatus.

В этом случае, когда выбрасывается исключение, контроллер, который его выдал, возвращает ответ с кодом ответа 403 (Запрещено). При необходимости вы также можете добавить сообщение с аннотацией, которое будет возвращено вместе с ответом.

В этом случае класс будет выглядеть так:

@ResponseStatus(value = HttpStatus.FORBIDDEN, reason="To show an example of a custom message")
public class ForbiddenException extends RuntimeException {}

Важно отметить, что, хотя технически возможно сделать исключение, возвращающее любой код состояния, в большинстве случаев имеет смысл использовать исключения только для кодов ошибок (4XX и 5XX).

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

В учебнике показано, как вернуть пользовательские коды состояния из контроллеров Spring MVC.

Реализацию можно найти вexample GitHub project.