【问题标题】:Jersey Client thrown NullPointerException on AndroidJersey 客户端在 Android 上抛出 NullPointerException
【发布时间】:2012-01-21 00:02:24
【问题描述】:

我正在尝试使用 jersey-client 库来使用 atom 提要,但运气不佳。这是我正在使用的代码:

    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(new 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.access$000(Client.java:118) E/AndroidRuntime(12789):在 com.sun.jersey.api.client.Client$1.f(Client.java:191) E/AndroidRuntime(12789):在 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.(Client.java:159) E/AndroidRuntime(12789): at com.sun.jersey.api.client.Client.create(Client.java:669)

我几乎被困住了,所以如果有人有任何想法/已经解决了这个问题,那就太好了!

干杯,马克

【问题讨论】:

标签: android nullpointerexception jersey


【解决方案1】:

你应该把你的代码包装在
if(response.getStatus() == Response.Status.OK &amp;&amp; response.hasEntity()){...} 您确定请求返回的是非空响应吗?

【讨论】:

  • 我尝试将该条件语句添加到代码中,但它仍然抛出相同的异常。有趣的是,相同的代码在我的机器上运行而不是在 Android 上运行良好......
【解决方案2】:

我在华硕 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;

你需要 Apache commons http://commons.apache.org/proper/commons-io/download_io.cgi 才能工作。希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多