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.
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.