我正在编写一个调用Web服务的Android客户端。该服务使用JAX-RS / Jersey API编写。我也试图在android端使用Jersey-Client API。
Client client = Client.create();
WebResource webResource = client.resource(server + "/api/restaurant_info/update");
MultivaluedMap formData = new MultivaluedMapImpl();
formData.add("id", id);
formData.add("f", Boolean.toString(f));
formData.add("fId", fId);
ClientResponse response = webResource.type(MediaType.APPLICATION_FORM_URLENCODED).accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, formData);
RestInfo restInfo = response.getEntity(RestInfo.class);
return restInfo;
我已经在外部测试了Web服务,但似乎工作正常。当我尝试从我的应用程序中调用它时,我在ClientResponse行遇到NullPointerException。
03-26 14:15:43.735: WARN/System.err(1060): java.lang.NullPointerException
03-26 14:15:43.745: WARN/System.err(1060): at javax.ws.rs.core.MediaType.valueOf(MediaType.java:119)
03-26 14:15:43.745: WARN/System.err(1060): at com.sun.jersey.api.client.PartialRequestBuilder.type(PartialRequestBuilder.java:92)
03-26 14:15:43.755: WARN/System.err(1060): at com.sun.jersey.api.client.WebResource.type(WebResource.java:309)
03-26 14:15:43.755: WARN/System.err(1060): at com.era.external.era.ERAService.updateRestaurantFranchise(ERAService.java:80)
03-26 14:15:43.755: WARN/System.err(1060): at com.era.android.RestaurantActivity$4.onItemSelected(RestaurantActivity.java:201)
03-26 14:15:43.755: WARN/System.err(1060): at android.widget.AdapterView.fireOnSelected(AdapterView.java:856)
03-26 14:15:43.766: WARN/System.err(1060): at android.widget.AdapterView.access$200(AdapterView.java:41)
03-26 14:15:43.766: WARN/System.err(1060): at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:827)
03-26 14:15:43.776: WARN/System.err(1060): at android.os.Handler.handleCallback(Handler.java:587)
03-26 14:15:43.776: WARN/System.err(1060): at android.os.Handler.dispatchMessage(Handler.java:92)
03-26 14:15:43.776: WARN/System.err(1060): at android.os.Looper.loop(Looper.java:123)
03-26 14:15:43.786: WARN/System.err(1060): at android.app.ActivityThread.main(ActivityThread.java:3948)
03-26 14:15:43.786: WARN/System.err(1060): at java.lang.reflect.Method.invokeNative(Native Method)
03-26 14:15:43.796: WARN/System.err(1060): at java.lang.reflect.Method.invoke(Method.java:521)
03-26 14:15:43.796: WARN/System.err(1060): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
03-26 14:15:43.796: WARN/System.err(1060): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
03-26 14:15:43.806: WARN/System.err(1060): at dalvik.system.NativeStart.main(Native Method)
关于我做错的任何想法?
答案 0 :(得分:0)
根据堆栈跟踪判断,这可能是其中任何一件事
ERAService line
80 updateRestaurantFranchise
方法
{li> RestaurantActivity
onItemSelected
方法中的第201行
答案 1 :(得分:0)
Android拥有Dalvik虚拟机,而非原始JVM。我认为这就是为什么Jersey Client API在Android OS中不起作用的原因。但我确定无疑!
答案 2 :(得分:0)
我也是泽西新手,但我认为你的邮政编码不起作用的原因是formData必须是其中一种被接受的类型。我不完全确定此上下文中type和accept命令之间的区别,但我很确定formData必须是您的调用构建器支持的类型之一。例如。如果您将formData序列化为JSON对象并将type / accept设置为JSON,那么此代码将起作用。因为它可能正在调用一些bodymethodwriter将其序列化为可接受的类型,但formData没有一个,所以方法调用返回null。实际上,它看起来像调用ValueOf来尝试从formData中获取数据以进行序列化,但返回null。