web-dev-qa-db-fra.com

java.io.IOException: tentative de lecture à partir d'un flux fermé

Je passe un appel HTTPPost à l'aide du client HTTP Apache, puis j'essaie de créer un objet à partir de la réponse à l'aide de Jackson . Voici mon code:

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

La méthode makePublisherApiCall () sera appelée dans une boucle qui s'exécute environ 100 fois . Un problème survient lorsque je décomment de la ligne:

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

Après avoir commenté, je reçois une exception: 

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

Sinon, ça marche très bien .. Quelqu'un pourrait-il me dire ce que je fais mal, s'il vous plaît?.

10
Pratik

Que fait EntityUtils.toString(postResponse.getEntity()) avec l'entité de réponse? Je soupçonne qu'il consomme le flux de contenu de l'entité. Le HttpClient javadoc déclare que seules les entités pouvant être répétées peuvent être consommées plusieurs fois. Par conséquent, si l'entité n'est pas répétable, vous ne pouvez plus alimenter le mappeur en flux de contenu. Pour éviter cela, vous devez uniquement laisser le mappeur utiliser le flux. Si la journalisation du contenu est requise, enregistrez l'objet Réponse analysé.

29
Pyranja

J'ai eu le même problème. Assurez-vous de ne pas consommer le flux de contenu de l'entité dans les sections "Regarder" ou "Inspecter" de votre IDE. Il est fermé après sa consommation (lire).

Et désolé pour mon anglais.

3
august0490

J'ai eu le même problème.

L'idée est que si vous utilisez postResponse, vous devez le mettre dans une variable pour pouvoir le réutiliser à différents endroits ..__ Sinon, la connexion est fermée et vous ne pouvez plus utiliser la même réponse.

J'avais l'habitude de le connecter (à des fins de débogage) et échoue toujours.

1
Rami Sharaiyri