我正在使用
spring
android rest模板并尝试将
JSON响应转换为java类,如图所示
here.
这是我试图完成工作的片段:
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);
我想我已经完成了所需的一切,因为它在文件中被告知:
>我的classpath中有以下jar
> jackson-all-1.7.6.jar
> spring-android-rest-template-1.0.0.M2.jar
> url确实返回了一个JSON对象.
> My Result类是一个包含所有必填字段的POJO
基本上我的类路径中有Jackson依赖项必须足以让它工作,因为它说:
The MappingJacksonHttpMessageConverter is conditionally loaded when you create a new RestTemplate instance. If the Jackson dependencies are found in your classpath,the message converter will be automatically added and available for use in REST operations.
那么我在这里缺少什么,我做错了什么?
谢谢
完整例外可以在这里找到:
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
解决方法
我从来没有在Android上做过任何事情,但我知道转换者对于Content-Type是挑剔的.对于杰克逊来说,消息体需要有’Content-Type:application / json’.尝试检查响应中的所有标头.