Jersey客户端API问题

我正在编写一个调用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) 

关于我做错的任何想法?

从堆栈跟踪来看,这可能是其中任何一个问题

  • updateRestaurantFranchise方法中的ERAService line 80 ERAService line
  • onItemSelected方法中的RestaurantActivity 201行

Android拥有Dalvik虚拟机,而非原始JVM。 我认为这就是为什么Jersey Client API在Android OS中不起作用的原因。 但我确定!

我也是泽西新手,但我认为你的邮政编码不起作用的原因是formData必须是接受的类型之一。 我不完全确定此上下文中type和accept命令之间的区别,但我非常确定formData必须是您的调用构建器支持的类型之一。 例如,如果您将formData序列化为JSON对象并将type / accept设置为JSON,那么此代码将起作用。 因为它可能正在调用一些bodymethodwriter将其序列化为可接受的类型,但formData没有一个,所以方法调用返回null。 实际上,它看起来像调用ValueOf来尝试从formData中获取数据以进行序列化,但返回null。