2016-06-02 1 views
3

Jersey Client를 사용하여 REST 서비스 호출을하고 있습니다. 이제 응답을 받으면 json 응답을 기록하려고하고 엔터티를 응답 bean에 채우고 싶습니다. 저지 클라이언트 로그 응답 및 getEntity

Client client = Client.create(config); 
ClientResponse cr = client 
        .resource(endPoint) 
        .accept("application/json") 
        .get(ClientResponse.class); 
clientResponse.bufferEntity(); 
String responseToLog = cr.getEntity(String.class); 
log.debug(responseToLog); 
MyResponseBean myResponse = cr.getEntity(MyResponseBean.class); 

이제 문제는 스트림이 후 처음으로 소비됩니다 우리가 두 번째로 사용할 수 없기 때문에 우리가() 두 배 getEntity를 호출 할 수 있다는 것입니다. 따라서 위의 코드는 No content to map to Object due to end of input을 예외로합니다. 나는 이것이 매우 독특한 요구 사항이 아니며 공통적이라고 확신합니다. 그렇다면 동일한 작업을 수행하는 가장 좋은 방법이나 방법은 무엇입니까?

+0

저지 [LoggingFilter] (https://jersey.java.net/nonav/apidocs/1.19/jersey/com/sun/jersey/api/client/filter/LoggingFilter.html)를 사용할 수 있습니다. 시체를 기록해야합니다. 그렇지 않은 경우 PrintStream을 제공하여 입력을 캡처 할 수도 있습니다. 아니면 bufferEntity가 작동해야합니다. 나는 모른다. 잠시 동안 Jersey 1을 사용하지 않았습니다. –

+0

시도해 볼 수는 있지만 기존 로거로 LoggingFilter를 연결하는 방법을 모르겠습니다. 나는 이것을 점검 할 것이다. – Siddharth

답변

3

EDIT

동작하는 예제 :

String endPoint = "http://localhost:8080/api/places"; 

Client client = new Client(); 
ClientResponse cr = client.resource(endPoint).accept("application/json").get(ClientResponse.class); 

cr.bufferEntity(); // buffer the entity (HttpInputStream->ByteArrayInputStream) 
String res1 = cr.getEntity(String.class); 

cr.getEntityInputStream().reset(); //reset the buffer, this is a ByteArrayInputStream 

String res2 = cr.getEntity(String.class);//read again 

참조 : bufferEntity의 출처를 확인한다.