2013-09-05 10 views
10

Sto effettuando una chiamata HTTPPost utilizzando Apache HTTP Client e quindi sto cercando di creare un oggetto dalla risposta utilizzando Jackson. Ecco il mio codice:java.io.IOException: tentativo di lettura dal flusso chiuso

private static final Logger log = Logger.getLogger(ReportingAPICall.class); 
ObjectMapper mapper = new ObjectMapper(); 

public void makePublisherApiCall(String jsonRequest) 
{ 
    String url = ReaderUtility.readPropertyFile().getProperty("hosturl"); 
    DefaultHttpClient client = new DefaultHttpClient(); 
    try { 
     HttpPost postRequest = new HttpPost(url); 
     StringEntity entity = new StringEntity(jsonRequest); 
     postRequest.addHeader("content-type", "application/json"); 
     log.info("pub id :"+ExcelReader.publisherId); 
     postRequest.addHeader("accountId", ExcelReader.publisherId); 
     postRequest.setEntity(entity); 
     HttpResponse postResponse = client.execute(postRequest); 
     log.info(EntityUtils.toString(postResponse.getEntity())); 

    // Response<PublisherReportResponse> response = mapper.readValue(postResponse.getEntity().getContent(), Response.class); 
    // log.info("Reponse "+response.toString()); 
    } catch (UnsupportedEncodingException ex) { 
     log.error(ex.getMessage()); 
     log.error(ex); 
     Assert.assertTrue(false, "Exception : UnsupportedEncodingException"); 
    } catch (ClientProtocolException ex) { 
     log.error(ex.getMessage()); 
     log.error(ex); 
     Assert.assertTrue(false, "Exception : ClientProtocolException"); 
    } catch (IOException ex) { 
     log.error(ex.getMessage()); 
     log.error(ex); 
     Assert.assertTrue(false, "Exception : IOException"); 
    } 

Metodo makePublisherApiCall() sarà chiamato in un ciclo che corre per dire 100 volte. Fondamentalmente problema si verifica quando il commento dalla riga:

// Response<PublisherReportResponse> response = mapper.readValue(postResponse.getEntity().getContent(), Response.class); 
// log.info("Reponse "+response.toString()); 

Dopo decommentando io sono sempre un'eccezione:

Attempted read from closed stream. 
17:26:59,384 ERROR com.inmobi.reporting.automation.reportingmanager.ReportingAPICall - java.io.IOException: Attempted read from closed stream. 

Altrimenti funziona benissimo. Qualcuno potrebbe farmi sapere cosa sto sbagliando.

risposta

24

Cosa fa EntityUtils.toString(postResponse.getEntity()) con l'entità di risposta? Sospetto, che stia consumando il flusso di contenuti dell'entità. Gli stati HttpClient javadoc affermano che solo le entità ripetibili possono essere consumate più di una volta. Pertanto se l'entità non è ripetibile non è possibile alimentare nuovamente il flusso di contenuti al mappatore. Per evitare ciò, è necessario consentire al mapper di utilizzare lo stream: se è richiesta la registrazione del contenuto, registrare l'oggetto Response analizzato.

+0

Ma ho pensato che questo 2 linee causano problemi. // Response response = mapper.readValue (postResponse.getEntity(). GetContent(), Response.class); // log.info ("Reponse" + response.toString()); Come dopo aver commentato questi programmi funziona bene. – Pratik

+2

Sì, certo. Se ho ragione, il problema è che puoi solo ** una volta ** consumare il contenuto dell'entità. Sospetto che lo stiate facendo due volte attraverso la registrazione e poi l'analisi. Se si desidera verificare se il mio sospetto è corretto, commentare 'log.info (EntityUtils.toString (postResponse.getEntity()));' e decommentare le seguenti due righe, quindi controllare di nuovo se funziona. – Pyranja

+0

Grazie Pyranja. Questo ha risolto il problema – Pratik

1

Ho avuto lo stesso problema.

L'idea è che se si utilizza la risposta post, è necessario inserirla in una variabile per poterla riutilizzare in luoghi diversi. Altrimenti, la connessione è chiusa e non è più possibile riprendere la stessa risposta.

Ho usato per accedere (a scopo di debug) e sempre non riesce.

2

Ho avuto lo stesso problema. Assicurati di non utilizzare il flusso di contenuti dell'entità nella sezione "watch" o "inspect" del tuo IDE. È chiuso dopo che è stato consumato (leggi).

E scusa per il mio inglese.

Problemi correlati