【发布时间】: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)
我几乎被困住了,所以如果有人有任何想法/已经解决了这个问题,那就太好了!
干杯,马克
【问题讨论】:
-
对我来说更多的是您将 FakeViewProvider 类放入错误的目录中。 SPI试图得到它,但无济于事。看看http://weblogs.java.net/blog/2006/04/07/creating-service-provider-interface如何正确配置SPI。
-
META-INF/services/jersey-client-components
-
也许this answer 会帮助你。
标签: android nullpointerexception jersey