Часто при использовании 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 статусами ответов.
Перейти в телеграм, чтобы получить результаты теста



Забрать
Добавить комментарий