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が受け入れるかどうかを確認するために、InputStream
でResponseEntity
を返してみました。
return new ResponseEntity(inputStream, httpHeaders, HttpStatus.OK);
ただし、次の例外がスローされます。
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
HttpServletResponse
のすべてを直接設定することで関数を機能させることができますが、これはSpringでのみ行いたいと思います。
Springの InputStreamResource はうまく機能します。 Content-Lengthを手動で設定する必要があります。または、Springがストリームを読み取ってContent-Lengthを取得しようとしているようです。
InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
httpHeaders.setContentLength(contentLengthOfStream);
return new ResponseEntity(inputStreamResource, httpHeaders, HttpStatus.OK);
このクラスの使用を示唆するWebページは見つかりませんでした。 ByteArrayResourceを使用するためのいくつかの提案があることに気付いたので、私はそれを推測しました。