Рубрики
Без рубрики

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

В этой статье демонстрируются два способа возврата пользовательских кодов состояния HTTP из контроллеров Spring MVC: использование ResponseEntity и использование исключений.

Автор оригинала: Eugen Paraschiv.

1. Обзор

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

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

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

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

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

  • использование 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 на ” /исключение “, 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 .