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

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

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

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 .