Jersey客户端API问题

时间:2011-03-26 19:24:35

标签: java android web-services jersey jax-rs

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

关于我做错的任何想法?

3 个答案:

答案 0 :(得分:0)

根据堆栈跟踪判断,这可能是其中任何一件事

    {li> 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。