web-dev-qa-db-fra.com

Comment renvoyer l'état de réponse 404 dans Spring Boot @ResponseBody - le type de retour de méthode est Response?

J'utilise Spring Boot avec l'approche basée sur @ResponseBody comme suit:

@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());

}

J'ai essayé quelques approches typiques comme:

res.setStatus (HttpStatus.NOT_FOUND.value ());
new ResponseEntity (HttpStatus.BAD_REQUEST);

mais j'ai besoin de retourner Réponse .

Comment retourner ici le code de statut 404 si la vidéo est nulle?

14
nazar_art

Créez une classe NotFoundException avec une annotation @ResponseStatus(HttpStatus.NOT_FOUND) et envoyez-la à partir de votre contrôleur.

@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "video not found")
public class VideoNotFoundException extends RuntimeException {
}
43
chrylis

Votre méthode d'origine peut renvoyer ResponseEntity (ne modifie pas le comportement de votre méthode):

@RequestMapping(value = VIDEO_DATA_PATH, method = RequestMethod.GET)
public ResponseEntity getData(@PathVariable(ID_PARAMETER) long id, HttpServletResponse res{
... 
}

et renvoyer ce qui suit:

return new ResponseEntity(HttpStatus.NOT_FOUND);
21
amazia

Ceci est très simplement fait en jetant org.springframework.web.server.ResponseStatusException :

throw new ResponseStatusException(
  HttpStatus.NOT_FOUND, "entity not found"
);

Il est compatible avec @ResponseBody et avec n'importe quelle valeur de retour.

1
andrej

Vous pouvez simplement définir responseStatus sur res comme ceci:

@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
 ...
}
1
Michał