2016-01-21 3 views
5

残りのテンプレートから入力ストリームを開く方法を探しています - ResponseExtractorを使用しようとしていましたが、ストリームが返される前に閉じています。大きなファイル処理のために残りのテンプレートから入力ストリームを開く

https://jira.spring.io/browse/SPR-7357

が、私は方法があることを願って「あなたは、単にメソッドの戻りを実行するための時間で、抽出からInputStreamを返すことはできませんが、基になる接続およびストリームがすでに閉じられています」残りのテンプレートに直接出力ストリームに書き込む必要はありません食べた。

答えて

1

私はそれを行う方法が見つからなかった、ストリームは常に閉じている。コントローラで、その後

public class StreamResourceReader implements ResourceReader { 

private HttpServletResponse response; 

public StreamResourceReader(HttpServletResponse response) { 
    this.response = response; 
} 

@Override 
public void read(InputStream content) { 
    try { 
     IOUtils.copy(content, response.getOutputStream()); 
    } catch (IOException e) { 
     throw new IllegalStateException(e); 
    } 
} 
} 

::次の実装と

public interface ResourceReader { 
    void read(InputStream content); 
} 

:回避策として、私は次のコードを作成し、残りのテンプレートに

@RequestMapping(value = "document/{objectId}") 
public void getDocumentContent(@PathVariable String objectId, HttpServletResponse response) { 
    ResourceReader reader = new StreamResourceReader(response); 
    service.readDocumentContent(objectId, reader); 
} 

はコール:

restTemplate.execute(uri, HttpMethod.GET, null, 
      new StreamResponseExtractor(reader)); 

と文字列rエスカレーション抽出プログラム:

@Override 
public ResponseEntity extractData(ClientHttpResponse response) throws IOException { 
    reader.read(response.getBody()); 
    return null; 
} 

これは魅力的です。 :)

+0

これで、ファイル全体がメモリにロードされませんか? –

+0

はい、メモリにファイル全体がある必要はありません。処理中にファイル全体が読み込まれますが、あまりメモリが必要ありません – zibi

+0

私は同じことに従っています。私はinputStreamが切り捨てられているのを見ています。 https://stackoverflow.com/questions/46332692/response-body-from-resttemplate-is-getting-truncated-when-downloading-a-file –

関連する問題