2016-01-21 5 views
5

Szukam sposobu, aby uzyskać otwarty strumień wejściowy z szablonu odpoczynku - Próbowałem użyć ResponseExtractor, ale strumień jest zamykany przed powrotem, jak napisano tutaj:Uzyskaj otwarty strumień wejściowy z szablonu odpoczynku dla dużego przetwarzania plików

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

„Pamiętaj, że nie możesz po prostu odesłać InputStream z ekstraktora, ponieważ do czasu wykonać metoda zwraca, podstawowe połączenie i strumień są już zamknięte”

mam nadzieję, że istnieje sposób, i nie będę musiał pisać do strumienia wyjściowego bezpośrednio w szablonie jadł.

Odpowiedz

1

Nie znalazłem sposobu, aby to zrobić, strumień jest zawsze zamykany. Jako obejście stworzyłem następujący kod:

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

z następującym realizacji:

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

następnie w kontrolerze:

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

wezwanie do szablonu rekreacyjne:

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

i ciąg r esponse extractor:

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

i działa jak urok! :)

+0

, więc to nie ładuje całego pliku do pamięci? –

+0

tak, to nie wymaga posiadania całego pliku w pamięci. Załaduje cały plik podczas jego przetwarzania, ale nie wymaga dużo pamięci. – zibi

+0

Podążyłem za tym samym. ale widzę, że inputStream jest przycinany. https://stackoverflow.com/questions/46332692/response-body-from-resttemplate-is-getting-truncated-when-downloading-a-file –

Powiązane problemy