2011-10-12 3 views
1

다음과 같은 코드가 있습니다 :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 개체를 읽는 것입니다. 그래서 두 번째로 예외가 생깁니다. 그러나 문제는 알고 있지만 쉬운 해결책을 찾을 수는 없습니다. 그래서 그 문제를 해결하는 좋은 방법은 무엇입니까?

+0

이 아파치의 'HttpClient'입니까? 그렇다면 콘텐츠가 캐시되지 않는다는 것에 놀랐습니다. 그 부분은 정말 가난한 디자인 선택처럼 보입니다. 분명히 알 수 있듯이, 사용자에게 API에 불필요한 슬픔이 가득합니다. – mre

+0

Jersey Client에서 @ 동일한 동작이 발생합니다. –

+0

@ 매트 볼, 재미있는. 광기 뒤에서 추리가 있습니까? – mre

답변

2

response.getEntity().getContent()에 의해 반환 된 입력 스트림을 로컬 변수에 저장된 byte[]으로 읽어들입니다. Convert InputStream to byte array in 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"); 
+0

솔직히 전체 문서를 두 번 파싱 할 필요는 없습니다. 어떤 API가'XMLDocumentParser # parseDocument()'를 제공합니까? –

1

응답 내용을 한 번만 읽고 XMLDocumentParser.parseDocument과 호환되는 일종의 버퍼로 복사하십시오. 그런 다음 원하는만큼 여러 번 버퍼에서 데이터를 직접 파싱합니다.

-1

왜 이렇게 해보지 않으시겠습니까?

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"); 
+3

이것은 같은 문제입니다. – RoflcoptrException

관련 문제