web-dev-qa-db-fra.com

Renvoyer un flux avec ResponseEntity de Spring MVC

J'ai une méthode Spring MVC qui retourne un ResponseEntity. Selon les données spécifiques récupérées, il parfois doit renvoyer un flux de données à l'utilisateur. D'autres fois, il retournera autre chose qu'un flux et parfois une redirection. Je veux très certainement que ce soit un flux et non un tableau d'octets car il peut être volumineux.

Actuellement, je renvoie le flux à l'aide de l'extrait de code suivant:

HttpHeaders httpHeaders = createHttpHeaders();
IOUtils.copy(inputStream, httpServletResponse.getOutputStream());

return new ResponseEntity(httpHeaders, HttpStatus.OK);

Malheureusement, cela ne permet pas aux données Spring HttpHeaders de remplir réellement les en-têtes HTTP dans la réponse. Cela a du sens puisque mon code écrit dans le OutputStream avant que Spring ne reçoive le ResponseEntity.

Il serait très agréable de retourner en quelque sorte un ResponseEntity avec un InputStream un let Spring le gérer. Il serait également parallèle aux autres chemins de ma fonction où je peux retourner avec succès un ResponseEntity. Existe-t-il de toute façon que je peux accomplir cela avec Spring?


J'ai également essayé de renvoyer le InputStream dans le ResponseEntity juste pour voir si Spring l'accepterait.

return new ResponseEntity(inputStream, httpHeaders, HttpStatus.OK);

Mais il lève cette exception:

org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

Je peux faire fonctionner ma fonction en définissant tout sur le HttpServletResponse directement, mais je voudrais le faire uniquement avec Spring.

42
David V

Spring's InputStreamResource fonctionne bien. Vous devez définir la longueur de contenu manuellement, ou il semble que Spring tente de lire le flux pour obtenir la longueur de contenu.

InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
httpHeaders.setContentLength(contentLengthOfStream);
return new ResponseEntity(inputStreamResource, httpHeaders, HttpStatus.OK);

Je n'ai jamais trouvé de pages Web suggérant d'utiliser cette classe. Je ne l'ai deviné que parce que j'ai remarqué qu'il y avait quelques suggestions pour utiliser ByteArrayResource.

90
David V