Java.io.IOException: Попытка чтения из закрытого потока

Я делаю вызов HTTPPost с помощью Apache HTTP Client, а затем пытаюсь создать объект из ответа с помощью Jackson. Вот мой код:

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

Метод makePublisherApiCall() будет вызываться в цикле, который выполняется, скажем, 100 раз. В основном проблема возникает, когда я раскомментирую строку:

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

После раскола я получаю исключение:

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

В противном случае он отлично работает. Может кто-то, пожалуйста, дайте мне знать, что я делаю неправильно.

Ответ 1

Что делает EntityUtils.toString(postResponse.getEntity()) с объектом ответа? Я подозреваю, что он потребляет поток контента сущности. HttpClient javadoc утверждает, что только объекты, которые можно воспроизводить, могут потребляться более одного раза. Поэтому, если объект не повторяется, вы не можете снова передать поток контента в устройство отображения. Чтобы этого избежать, вы должны разрешить кэпперу потреблять поток - если требуется ведение журнала содержимого, запишите обработанный объект Response.

Ответ 2

У меня была та же проблема. Убедитесь, что вы не потребляете поток контента сущности в разделе "смотреть" или "проверять" своей среды разработки. Он закрывается после его потребления (чтение).

И извините за мой английский.

Ответ 3

У меня была та же проблема.

Идея состоит в том, что если вы будете использовать postResponse, тогда вы должны поместить его в переменную, чтобы снова использовать ее в разных местах. В противном случае соединение будет закрыто, и вы больше не сможете снова использовать тот же ответ.

Я использовал для его регистрации (для целей отладки) и всегда терпит неудачу.

Ответ 4

Я не думаю, что эта проблема связана с любым ответом, я получаю эту проблему, потому что я не использую

closeableresponce=client.Getmethod(FinalUrl);

В моем первом Test1, это было упоминание, но когда я пропустил тест2, я забыл поместить этот код, почему потоки закрытых сообщений показывают...

public void getapiwithheader() throws ParseException, IOException
{
    client = new RestClient();
    closeableresponce=client.Getmethod(FinalUrl);

    HashMap<String, String> headermap = new HashMap<>();
    headermap.put("content-type", "application/json");
    //****************************************************************************    
    //Status code
    //****************************************************************************      
    int statuscode =closeableresponce.getStatusLine().getStatusCode();
    System.out.println("Status code "+statuscode);
    Assert.assertEquals(statuscode,RESPONSE_STATUS_CODE_200, "Status code is not 200");


    //****************************************************************************  
    // Json String
    //****************************************************************************      
    String responsestring=  EntityUtils.toString(closeableresponce.getEntity(),"UTF-8");
    JSONObject respjsonobj = new JSONObject(responsestring);
    System.out.println("Respose Json API"+respjsonobj);

    //****************************************************************************      
    // Verify the value of the JSON
    //****************************************************************************      
    String Email =TestUtil.getValueByJPath(respjsonobj,"/email");
    System.out.println("******************************************");
    System.out.println("Print the value of Email "+Email);
    Assert.assertEquals(Email, "[email protected]");
}