Как вернуть 404 статус ответа в Spring Boot @ResponseBody - тип возвращаемого метода - это Response?
Я использую Spring Boot с подходом на основе @ResponseBody, как показано ниже:
@RequestMapping(value = VIDEO_DATA_PATH, method = RequestMethod.GET)
public @ResponseBody Response getData(@PathVariable(ID_PARAMETER) long id, HttpServletResponse res) {
Video video = null;
Response response = null;
video = videos.get(id - 1);
if (video == null) {
// TODO how to return 404 status
}
serveSomeVideo(video, res);
VideoSvcApi client = new RestAdapter.Builder()
.setEndpoint("http://localhost:8080").build().create(VideoSvcApi.class);
response = client.getData(video.getId());
return response;
}
public void serveSomeVideo(Video v, HttpServletResponse response) throws IOException {
if (videoDataMgr == null) {
videoDataMgr = VideoFileManager.get();
}
response.addHeader("Content-Type", v.getContentType());
videoDataMgr.copyVideoData(v, response.getOutputStream());
response.setStatus(200);
response.addHeader("Content-Type", v.getContentType());
}
Я попробовал несколько типичных подходов:
res.setStatus(HttpStatus.NOT_FOUND.value());
new ResponseEntity(HttpStatus.BAD_REQUEST);
но мне нужно вернуть ответ.
Как вернуть код состояния 404, если видео пустое?
Ответы
Ответ 1
Создайте класс NotFoundException
с аннотацией @ResponseStatus(HttpStatus.NOT_FOUND)
и выбросите его с вашего контроллера.
@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "video not found")
public class VideoNotFoundException extends RuntimeException {
}
Ответ 2
Ваш оригинальный метод может вернуть ResponseEntity (не изменяет поведение вашего метода):
@RequestMapping(value = VIDEO_DATA_PATH, method = RequestMethod.GET)
public ResponseEntity getData(@PathVariable(ID_PARAMETER) long id, HttpServletResponse res{
...
}
и вернуть следующее:
return new ResponseEntity(HttpStatus.NOT_FOUND);
Ответ 3
Это очень просто сделать, выдав org.springframework.web.server.ResponseStatusException:
throw new ResponseStatusException(
HttpStatus.NOT_FOUND, "entity not found"
);
Он совместим с @ResponseBody и с любым возвращаемым значением. Требуется spring 5+
Ответ 4
Вы можете просто установить responseStatus на res следующим образом:
@RequestMapping(value = VIDEO_DATA_PATH, method = RequestMethod.GET)
public ResponseEntity getData(@PathVariable(ID_PARAMETER) long id,
HttpServletResponse res) {
...
res.setStatus(HttpServletResponse.SC_NOT_FOUND);
// or res.setStatus(404)
return null; // or build some response entity
...
}