IllegalStateException: содержимое было использовано - как решить?
У меня есть следующий код:
HttpGet httpGet = new HttpGet(serverAdress + "/rootservices");
httpGet.setHeader("Accept", "text/xml");
HttpResponse response = client.execute(httpGet, localContext);
String projectURL = XMLDocumentParser.parseDocument(response.getEntity().getContent(), "oslc_scm:scmServiceProviders", "rdf:resource");
String workItemURL = XMLDocumentParser.parseDocument(response.getEntity().getContent(), "oslc_cm:cmServiceProviders", "rdf:resource");
Проблема в том, что я дважды прочитал объект HttpResponse. Поэтому во второй раз я получаю исключение. Но хотя я знаю проблему, я не могу найти легкого решения. Итак, что является хорошим способом решить эту проблему?
3 ответа
Решение
Прочитать поток ввода, возвращенный response.getEntity().getContent()
в byte[]
хранится в локальной переменной. См. Преобразование InputStream в байтовый массив в Java.
byte[] content = IOUtils.toByteArray(response.getEntity().getContent());
String projectURL = XMLDocumentParser.parseDocument(new ByteArrayInputStream(content), "oslc_scm:scmServiceProviders", "rdf:resource");
String workItemURL = XMLDocumentParser.parseDocument(new ByteArrayInputStream(content), "oslc_cm:cmServiceProviders", "rdf:resource");
Прочитайте содержимое ответа только один раз и скопируйте его в какой-нибудь буфер, совместимый с XMLDocumentParser.parseDocument
, Затем анализируйте данные прямо из буфера столько раз, сколько захотите.
Почему бы тебе не попробовать это так?
HttpGet httpGet = new HttpGet(serverAdress + "/rootservices");
httpGet.setHeader("Accept", "text/xml");
InputStream in = null;
HttpResponse response = client.execute(httpGet, localContext);
in = response.getEntity().getContent();
String projectURL = XMLDocumentParser.parseDocument(in, "oslc_scm:scmServiceProviders", "rdf:resource");
String workItemURL = XMLDocumentParser.parseDocument(in, "oslc_cm:cmServiceProviders", "rdf:resource");