«1. Обзор

Эта короткая статья продемонстрирует несколько способов возврата пользовательских кодов состояния HTTP из контроллеров Spring MVC.

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

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

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

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

    использование ResponseEntity, использование аннотации @ResponseStatus для классов исключений, а также использование @ControllerAdvice и @ Аннотации ExceptionHandler.

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

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

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 (полный список можно найти здесь).

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

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

@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.

Реализацию можно найти в примере проекта GitHub.