Часто при использовании Spring MVC для создания JSON API, разработчики сталкиваются с необходимостью обрабатывать ошибки и отправлять ответы с определенными HTTP статусами. Вернемся к примеру, где используется подход @ResponseBody, а метод возвращает тип String.
@RequestMapping(value = "/matches/{matchId}", produces = "application/json") @ResponseBody public String match(@PathVariable String matchId) { String json = matchService.getMatchJson(matchId); if (json == null) { // TODO: как ответить, например, 400 "плохой запрос"? } return json; }
В этом примере, если json == null, разработчик хочет отправить ответ с HTTP статусом 400, что означает «плохой запрос». Но как это сделать, если возвращаемый тип метода — String?
Хотя Spring MVC предлагает такой подход, как использование ResponseEntity
, который позволяет устанавливать статус ответа, в данном случае он не подходит.
return new ResponseEntity(HttpStatus.BAD_REQUEST);
Метод возвращает String, а не ResponseEntity, поэтому этот подход здесь использовать нельзя.
Однако, на помощь приходит Spring и его исключения. В Spring MVC можно определить специальные обработчики исключений с помощью аннотации @ExceptionHandler
. Эти обработчики могут быть использованы для отправки ответов с определенными HTTP статусами.
@ResponseStatus(HttpStatus.BAD_REQUEST) public class BadRequestException extends RuntimeException { } @RequestMapping(value = "/matches/{matchId}", produces = "application/json") @ResponseBody public String match(@PathVariable String matchId) { String json = matchService.getMatchJson(matchId); if (json == null) { throw new BadRequestException(); } return json; }
В данном примере, если json == null, выбрасывается исключение BadRequestException. Благодаря аннотации @ResponseStatus(HttpStatus.BAD_REQUEST)
, Spring автоматически отправит ответ с HTTP статусом 400.
Таким образом, даже если метод контроллера возвращает String, с помощью исключений Spring MVC можно управлять HTTP статусами ответов.
Добавить комментарий