मैं spring android rest template
का उपयोग कर रहा हूं और जेएसओएन प्रतिक्रिया को जावा क्लास में बदलने की कोशिश कर रहा हूं जैसा कि दिखाया गया है यहां।
यहाँ मेरा स्निपेट काम करने की कोशिश कर रहा है:
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);
मुझे लगता है कि मैंने आवश्यक सब कुछ किया है जैसा कि दस्तावेज़ में बताया गया है:
- मेरे क्लासपाथ में मेरे पास निम्नलिखित जार हैं:
- जैक्सन-ऑल-1.7.6.जार
- स्प्रिंग-एंड्रॉइड-रेस्ट-टेम्पलेट-1.0.0.M2.jar
url
वास्तव में एक JSON ऑब्जेक्ट देता है।- मेरी
Result
कक्षा सभी आवश्यक क्षेत्रों के साथ एक POJO है
मूल रूप से मेरे क्लासपाथ में Jackson dependencies
होने के कारण इसे काम करने के लिए पर्याप्त होना चाहिए जैसा कि यह कहता है:
जब आप एक नया RestTemplate उदाहरण बनाते हैं तो MappingJacksonHttpMessageConverter सशर्त रूप से लोड हो जाता है। यदि आपके क्लासपाथ में जैक्सन निर्भरता पाई जाती है, तो संदेश कनवर्टर स्वचालित रूप से जोड़ा जाएगा और आरईएसटी संचालन में उपयोग के लिए उपलब्ध होगा।
तो मैं यहाँ क्या खो रहा हूँ, मैं क्या गलत कर रहा हूँ?
धन्यवाद
पूर्ण अपवाद यहां पाया जा सकता है:
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 जवाब
मैंने एंड्रॉइड पर कभी कुछ नहीं किया है, लेकिन मुझे पता है कि सामग्री-प्रकार के साथ कन्वर्टर्स पसंद करते हैं। जैक्सन को काम करने के लिए संदेश के मुख्य भाग में 'Content-Type: application/json' होना चाहिए। प्रतिक्रिया पर सभी शीर्षलेखों की जांच करने का प्रयास करें।
मैं एक ही अपवाद से मिला हूं और इसे अभी ठीक कर दिया है।
मूल कारण
सर्वर पर, मैं इस तरह प्रतिक्रिया सेट कर रहा था:
response.setContentType("text/html;charset=utf-8");
समाधान
मैंने सामग्री को इस तरह अपडेट किया:
response.setContentType("application/json;charset=utf-8");
मेरे लिए, यह त्रुटि उस वर्ग के लिए फेंक दी गई थी जो किसी निश्चित संपत्ति के लिए स्ट्रिंग के बजाय एनम प्रकार का उपयोग करेगी।
दूसरा कारण यह भी हो सकता है कि आप जैक्सन 2 का उपयोग कर रहे हैं। फिर आपको MappingJackson2HttpMessageConverter
(MappingJacksonHttpMessageConverter
के बजाय) में बदलना चाहिए।
यहाँ इसी तरह की स्थिति में मेरे लिए क्या काम किया है:
HttpHeaders requestHeaders = नया HttpHeaders (); // मल्टीपार्ट/फॉर्म-डेटा अनुरोध भेजा जा रहा हैHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
// अनुरोध के लिए उपयोग करने के लिए HttpEntity ऑब्जेक्ट में क्रमबद्ध किए जा रहे MultiValueMap और हेडर को पॉप्युलेट करें HttpEntity> requestEntity = new HttpEntity>(parts, requestHeaders);
रेस्ट टेम्पलेट बाकी टेम्पलेट = getRestTemplate (); RestTemplate.getMessageConverters ()। जोड़ें (नया FormHttpMessageConverter ()); RestTemplate.getMessageConverters ()। जोड़ें (नया मैपिंगजैक्सन2HttpMessageConverter ());
वापसी बाकी टेम्पलेट। पोस्टफॉरऑब्जेक्ट (यूआरआई, रिक्वेस्टएंटिटी, एपीआईरेस्पॉन्सअपलोड। क्लास);
संबंधित सवाल
नए सवाल
android
एंड्रॉइड Google का मोबाइल ऑपरेटिंग सिस्टम है, जिसका उपयोग प्रोग्रामिंग या डिजिटल डिवाइस (स्मार्टफोन, टैबलेट, ऑटोमोबाइल्स, टीवी, वियर, ग्लास, IoT) को विकसित करने के लिए किया जाता है। एंड्रॉइड से संबंधित विषयों के लिए, एंड्रॉइड-विशिष्ट टैग जैसे कि एंड्रॉइड-इरादे, एंड्रॉइड-गतिविधि, एंड्रॉइड-एडॉप्टर आदि का उपयोग करें। विकास या प्रोग्रामिंग के अलावा अन्य प्रश्नों के लिए, लेकिन एंड्रॉइड फ्रेमवर्क से संबंधित हैं, इस लिंक का उपयोग करें: https: // android.stackexchange.com।