web-dev-qa-db-ja.com

Spring MVCのResponseEntityでストリームを返す

ResponseEntityを返すSpring MVCメソッドがあります。取得した特定のデータに応じて、時々はデータのストリームをユーザーに返す必要があります。それ以外の場合は、ストリーム以外の何かを返し、時にはリダイレクトを返します。これは、バイト配列ではなくストリームになります。サイズが大きくなる可能性があるためです。

現在、次のコードスニペットを使用してストリームを返します。

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

return new ResponseEntity(httpHeaders, HttpStatus.OK);

残念ながら、これにより、Spring HttpHeadersデータが実際に応答のHTTPヘッダーに入力できません。 SpringがOutputStreamを受け取る前に私のコードがResponseEntityに書き込むため、これは理にかなっています。

何らかの方法でResponseEntityとともにInputStreamを返し、Springが処理できるようにすることは非常に素晴らしいことです。また、ResponseEntityを正常に返すことができる関数の他のパスと並行します。とにかくこれをSpringで達成できますか?


また、Springが受け入れるかどうかを確認するために、InputStreamResponseEntityを返してみました。

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

ただし、次の例外がスローされます。

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

HttpServletResponseのすべてを直接設定することで関数を機能させることができますが、これはSpringでのみ行いたいと思います。

42
David V

Springの InputStreamResource はうまく機能します。 Content-Lengthを手動で設定する必要があります。または、Springがストリームを読み取ってContent-Lengthを取得しようとしているようです。

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

このクラスの使用を示唆するWebページは見つかりませんでした。 ByteArrayResourceを使用するためのいくつかの提案があることに気付いたので、私はそれを推測しました。

90
David V