2011-04-20 127 views
7

我正在使用spring android rest template并试图将JSON响应转换为java类,如here所示。android RestClientException:找不到合适的HttpMessageConverter

这里是我的代码段试图做的工作:

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); 

我觉得我已经做了所需要的一切,因为它是在文件中说:

  • 我已经在我的类路径 以下罐子
    • 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 
+0

这非常有趣。我很想听到答案。 – aykut 2011-05-03 07:50:26

回答

2

我从来没有做过Android上的任何东西,但我知道皈依是挑剔的Content-Type。对于杰克逊来说,邮件正文需要有'Content-Type:application/json'。尝试检查响应中的所有标题。

+3

哇,这已经有一段时间了,我不记得我是如何解决这个问题的,但是它就像你建议的那样,实际上我使用了应用程序/ json :) – dds 2011-11-15 12:32:40

+0

我有同样的问题,但我无法更改内容类型,因为我的API是第三方API。除了更改内容类型之外,是否还有其他选择? – 2014-03-11 14:55:32

1

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

根源

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

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

解决方案

我更新的contentType是这样的:

response.setContentType("application/json;charset=utf-8"); 
0

以下是我在类似情况下工作的内容:

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

//填充MultiValueMap被序列化,并在 HttpEntity对象标头以用于请求 HttpEntity> requestEntity =新 HttpEntity>(零件,requestHeaders);

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

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

1

对我来说,这个错误是对于某个属性使用枚举类型而不是字符串的类抛出的。

另一个原因可能是您正在使用Jackson 2.您应该更改为MappingJackson2HttpMessageConverter(而不是MappingJacksonHttpMessageConverter)。

相关问题