2012-01-21 2 views
1

jersey-client 라이브러리를 사용하여 원자 피드를 소비하려고하지만 많은 행운이 없습니다. 이것은 내가 사용하고 코드입니다 :Jersey 클라이언트가 Android에서 NullPointerException을 발생했습니다.

원래 날이 예외 점점되었다
Client client = Client.create(); 
    ClientResponse response = client.resource("http://192.168.1.65:9998/tweets").accept(MediaType.APPLICATION_ATOM_XML).get(ClientResponse.class); 
    String responseString = response.getEntity(String.class); 

:

E/AndroidRuntime (13126) : java.lang.NullPointerException이 E/AndroidRuntime을 (13126) : javax.ws.rs.core.MediaType.valueOf (MediaType.java:119) E/AndroidRuntime (13126) : at> com.sun.jersey.api.client.ClientResponse.getType (ClientResponse.java:614) E/AndroidRuntime (13126) : com.sun.jersey.api.client.ClientResponse.getEntity (ClientResponse.java:531) E/AndroidRuntime (13126) : com.sun.jersey.api.client. ClientResponse.getEntity (ClientResponse.java:506) E/AndroidRuntime (13126) : com.pivotallabs.tracker.TweetsService.onHandleIntent (TweetsService.java:55) E/AndroidRuntime (13126) : android.app.IntentService $ ServiceHandler.handleMessage (IntentService.java:59) E/AndroidRuntime (13126) : android.os.Handler.dispatchMessage (Handler.java:99) E/AndroidRuntime (13126) : android.os.Looper.loop Looper.java:130) E/AndroidRuntime (13126) : android.os.HandlerThread.run에서 (HandlerThread.java:60) 나는이 질문에서 솔루션을 사용하려고

-Jersey client in android with protocol buffer - 쓰기를 포함 커스텀 ServiceIteratorProvider를 사용하면 첫 번째 프로 우블을 제거 할 수 있습니다. 그런 다음 ServiceIteratorProvider가 com.sun.jersey.client.proxy.ViewProxyProvider의 구현을 찾고있는 새로운 문제를 만들었습니다.

나는 그 가짜 구현 만든 :

public class FakeViewProvider implements com.sun.jersey.client.proxy.ViewProxyProvider { 

    public <T> ViewProxy<T> proxy(Client client, Class<T> tClass) { 
     Class[] interfaces = new Class[] {tClass}; 
     return (ViewProxy<T>) Proxy.newProxyInstance(tClass.getClassLoader(), interfaces, new Delegator(interfaces, new Object[]{})); 
    } 
} 

을 그리고 전화가 Client.create하기 직전에 그것을 연결 :

ServiceFinder.setIteratorProvider를 (새 Buscador());

...하지만 지금은 대신이 오류를 얻을 :

E/AndroidRuntime (12789) : java.lang.NullPointerException이 E/AndroidRuntime (12789) : com.sun.jersey.spi에서. service.ServiceFinder.toClassArray (ServiceFinder.java:595) E/AndroidRuntime (12789) : com.sun.jersey.core.spi.component.ProviderServices.getServiceClasses (ProviderServices.java:318) E/AndroidRuntime (12789) : com.sun.jersey.core.spi.component.ProviderServices.getServiceClasses (ProviderServices.java:311) E/AndroidRuntime (12789) : com.sun.jersey.core.spi.component.ProviderServices.getServices (ProviderServices .java : 159) E/AndroidRuntime (12789) : com.sun.jersey.api.client.Client.init (Client.java:249) E/AndroidRuntime (12789) : com.sun.jersey.api.client.Client. $ 000 (Client.java:191) E/AndroidRuntime (12789) : com.sun.jersey.api.client.Client $ 1.f (Client.java:191) E/AndroidRuntime (12789) : at com. sun.jersey.api.client.Client $ 1.f (Client.java:187) E/AndroidRuntime (12789) : com.sun.jersey.spi.inject.Errors.processWithErrors (Errors.java:193) E/AndroidRuntime (12789) : com.sun.jersey.api.client.Client. (Client.java:187) E/AndroidRuntime (12789) : com.sun.jersey.api.client.Client. (클라이언트. java : 159) E/AndroidRuntime (12789) : com.sun.jersey.api.client.Client.create (클라이언트.java : 669)

아무리 생각해 본 사람이 있으면이 문제가 해결되어 멋지다고 생각합니다.

건배, 마크

+0

나를 위해 FakeViewProvider 클래스를 잘못된 디렉토리에 두는 것이 더 중요합니다. SPI는 그것을 얻으려고하지만 아무 소용이 없습니다. [http://weblogs.java.net/blog/2006/04/07/creating-service-provider-interface](http://weblogs.java.net/blog/2006/04/07/creating- service-provider-interface)를 사용하여 SPI를 올바르게 구성하는 방법에 대해 설명합니다. –

+0

META-INF/services/jersey-client-components –

+0

어쩌면 [이 답변] (http://stackoverflow.com/questions/9342506/jersey-client-on-android-nullpointerexception?answertab=active#tab-top) 도와주세요. – rAy

답변

0

당신이 if(response.getStatus() == Response.Status.OK && response.hasEntity()){...}
의 코드는 당신에게 요청이 비어 있지 않은 응답을 반환 확신 포장해야합니까?

+0

코드에 해당 조건문을 추가하려고 시도했지만 여전히 동일한 예외가 발생합니다. 흥미로운 점은 Android가 아닌 내 컴퓨터에서 실행될 때 동일한 코드가 제대로 작동한다는 것입니다 ... –

0

Asus Memopad 및 galaxyS4 테스트 장치에서 테스트 할 때 같은 문제가 발생했습니다. 방법은 다음과 같습니다.

Client client = Client.create(); 
ClientResponse response = client.resource("http://192.168.1.65:9998/tweets").accept(MediaType.APPLICATION_ATOM_XML).get(ClientResponse.class); 

//change to this. pull the input stream from the response and use apache commons to form the input stream into a string 
     StringWriter writer = new StringWriter(); 
    try { 
     IOUtils.copy(response.getEntityInputStream(), writer, Charset.defaultCharset()); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    String theString = writer.toString(); 
    String output = theString; 

이 작업을하려면 아파치 공유지 http://commons.apache.org/proper/commons-io/download_io.cgi이 필요합니다. 나는 그것이 도움이되기를 바랍니다.

관련 문제