2016-01-21 11 views
5

我正在尋找一種方法從休息模板中獲取打開的輸入流 - 我試圖使用ResponseExtractor,但是在返回之前流正在關閉,如下所示:從大型文件處理的休息模板獲取打開的輸入流

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

「需要注意的是,你不能簡單地從提取返回InputStream的,因爲當時的執行方法返回時,底層的連接和流已經關閉」

我希望有一種方法而且我不需要直接在剩餘的templ中寫入我的輸出流吃了。

回答

1

我沒有找到辦法做到這一點,流始終關閉。作爲一種變通方法,我創建了下面的代碼:

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

與下面的實現:

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); 
    } 
} 
} 

然後控制器:

@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 esponse萃取器:

@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 –