7

我正在使用spring android rest template并尝试将 JSON 响应转换为 java 类,如此处所示

这是我试图做这项工作的片段:

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.getMessageConverters().add(new MappingJacksonHttpMessageConverter());

    //I have already tried to manually setting converters with no luck
    //List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
    //messageConverters.add(new MappingJacksonHttpMessageConverter());
    //messageConverters.add(new FormHttpMessageConverter());
    //messageConverters.add(new StringHttpMessageConverter());
    //restTemplate.setMessageConverters(messageConverters);

    Result result = restTemplate.getForObject(url, Result.class);

我想我已经完成了文件中所要求的一切:

  • 我的类路径中有以下 jars
    • jackson-all-1.7.6.jar
    • spring-android-rest-template-1.0.0.M2.jar
  • url真正返回一个 JSON 对象。
  • 我的Result班级是一个 POJO,包含所有必填字段

基本上,Jackson dependencies在我的类路径中必须足以让它像它所说的那样工作:

MappingJacksonHttpMessageConverter 在您创建新的 RestTemplate 实例时有条件地加载。如果在您的类路径中找到 Jackson 依赖项,则会自动添加消息转换器并可用于 REST 操作。

那么我在这里缺少什么,我做错了什么?

谢谢

完整的例外可以在这里找到:

04-20 04:25:52.706: ERROR/AndroidRuntime(9638): FATAL EXCEPTION: main
04-20 04:25:52.706: ERROR/AndroidRuntime(9638): java.lang.IllegalStateException: Could not execute method of the activity
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at android.view.View$1.onClick(View.java:2083)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at android.view.View.performClick(View.java:2421)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at android.view.View$PerformClick.run(View.java:8869)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at android.os.Handler.handleCallback(Handler.java:587)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at android.os.Looper.loop(Looper.java:143)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at android.app.ActivityThread.main(ActivityThread.java:5068)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at java.lang.reflect.Method.invokeNative(Native Method)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at java.lang.reflect.Method.invoke(Method.java:521)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at dalvik.system.NativeStart.main(Native Method)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638): Caused by: java.lang.reflect.InvocationTargetException
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at xxx.SamplePageActivity.doRest(SamplePageActivity.java:83)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at java.lang.reflect.Method.invokeNative(Native Method)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at java.lang.reflect.Method.invoke(Method.java:521)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at android.view.View$1.onClick(View.java:2078)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     ... 11 more
04-20 04:25:52.706: ERROR/AndroidRuntime(9638): Caused by: org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [[Lxxx.SamplePageActivity$Result;] and content type [application/json;charset=UTF-8]
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:77)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:449)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:404)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:202)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     ... 15 more
4

4 回答 4

2

我从未在 Android 上做过任何事情,但我知道转换者对 Content-Type 很挑剔。要让 Jackson 工作,消息正文需要具有“Content-Type: application/json ”。尝试检查响应中的所有标头。

于 2011-11-11T19:40:14.400 回答
1

我遇到了同样的异常并现在修复它。

根本原因

在服务器上,我正在设置这样的响应:

response.setContentType("text/html;charset=utf-8");

解决方案

我像这样更新了 contentType:

response.setContentType("application/json;charset=utf-8");
于 2013-04-05T17:07:14.377 回答
1

对我来说,这个错误是针对将使用枚举类型而不是字符串作为某个属性的类引发的。

另一个原因也可能是您使用的是 Jackson 2。然后您应该更改为MappingJackson2HttpMessageConverter(而不是MappingJacksonHttpMessageConverter)。

于 2013-10-09T15:46:10.620 回答
0

以下是在类似情况下对我有用的方法:

HttpHeaders requestHeaders = new HttpHeaders(); // 发送 multipart/form-data requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);

// 填充被序列化的 MultiValueMap 和 HttpEntity 对象中的标头以用于请求 HttpEntity> requestEntity = new HttpEntity>(parts, requestHeaders);

RestTemplate restTemplate = getRestTemplate(); restTemplate.getMessageConverters().add(new FormHttpMessageConverter()); restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

return restTemplate.postForObject(URI, requestEntity, APIResponseUpload.class);

于 2013-04-16T02:45:42.267 回答