2011-12-14 15 views
5

मैं एक आरईएसटी वेब सेवा के खिलाफ कॉल करने के लिए स्प्रिंग के RestTemplate का उपयोग कर रहा हूं। इनमें से एक कॉल एक निश्चित प्रकार की वस्तुओं की एक सूची वापस करना है। RestTemplate विधियों की आवश्यकता है कि अपेक्षित रिटर्न प्रकार को इंगित करने के लिए कक्षा तर्क प्रदान किया जाए।सामान्य प्रकार की जानकारी अनुपलब्ध होने पर मैं कंपाइलर चेतावनियों से कैसे बचूं?

// restTemplate is type org.springframework.web.client.RestTemplate 
URI restServiceURI = new URI("http://example.com/foo") 
restTemplate.getForObject(restServiceURI, List<Foo>.class); 

जाहिर है, यह संकलित नहीं होता है। जब आप उस तरह के तर्क तर्क की आपूर्ति करते हैं तो आपको एक स्थिर .class संपत्ति नहीं मिल सकती है। जब मैं टाइप तर्क को हटाता हूं, तो कोड संकलित करता है, लेकिन यह rawtypes संकलक चेतावनी उत्पन्न करता है।

मेरा प्रश्न सरल है। क्या मैं संकलक चेतावनी दबाने के साथ अटक गया हूं या इसके लिए कोड करने का एक क्लीनर तरीका है?

उत्तर

3

लेकिन यह कैसे पता होगा RestTemplate सूची तत्वों को कक्षा Foo के उदाहरणों में परिवर्तित करने के लिए? क्या आपने कोड चलाने की कोशिश की है, और क्या यह अपेक्षित काम करता है?

एक तरह से मैं इसे गोल करने के बारे में सोच सकता हूं, एक इनपुट प्रकार के रूप में एक ऐरे का उपयोग करना होगा। जैसे।

restTemplate.getForObject(restServiceURI, Foo[].class); 

लेकिन मुझे नहीं पता कि यह समर्थित है या नहीं। यदि आपको वास्तव में अधिक जटिल डेटा प्रकारों को बेकार करने की आवश्यकता है तो आपको जैक्सन या जीसन का उपयोग करने पर विचार करना चाहिए।

जैक्सन के साथ आप ObjectMapper कक्षा का उपयोग अधिकांश स्रोतों से डेटा को आसानी से deserialise करने के लिए कर सकते हैं।

String input = ...; 
ObjectMapper mapper = new ObjectMapper(); 
List<Foo> list = mapper.readValue(input, new TypeReference<List<Foo>>(){}); 

ऊपर काम करता है क्योंकि आप जानबूझकर एक अनाम वर्ग कि TypeReference फैली बनाने के लिए, वर्ग रनटाइम पर इसके जेनेरिक प्रकार याद होगा और इसलिए यह फू की सूची बनाने के लिए वस्तु नक्शाकार कर सकते हैं। For a fuller explanation

+0

जैक्सन क्लासपाथ पर है, और स्प्रिंग 3.x स्वचालित रूप से उन धाराओं को मार्शल/अनमशेल करने के लिए उपयोग करता है। मैं अपने लाभ के लिए इसका लाभ उठाने की उम्मीद कर रहा था, लेकिन ऐसा लगता है कि मुझे इसे निम्न स्तर पर करने की ज़रूरत है। मुझे आश्चर्य है कि स्प्रिंग ने अन्य टेम्पलेट वर्गों के साथ संग्रह रिटर्न को संभालने का एक आसान तरीका प्रदान नहीं किया है। –

+0

यह विधि एक परिष्करण के साथ काम करता है। RestTemplate.getForObject() का उपयोग करने के बजाय मैं RestTemplate.execute() का उपयोग कर रहा हूं और अपना खुद का ResponseExtractor प्रदान कर रहा हूं। यह मुझे अवधारणा के सबूत के माध्यम से प्राप्त करता है, लेकिन मुझे लगता है कि सर्वर से प्रतिक्रिया प्रकार निर्धारित करने के लिए एक और चालाक तरीका है। अभी मैं JSON मान रहा हूं, लेकिन मुझे किसी बिंदु पर एक्सएमएल का समर्थन करने की आवश्यकता होगी। दिशा के लिए धन्यवाद! –

0

आप का उपयोग कर प्राप्त कर सकते हैं इस:

List<Class<Foo>> classList = new ArrayList<Class<Foo>>(); 
restTemplate.getForObject(restServiceURI, classList); 

यदि यह सिर्फ एक वस्तु और वर्ग की नहीं एक सूची है तो आप सिर्फ इस तरह से पारित कर सकते हैं:

restTemplate.getForObject(restServiceURI, Foo.class); 
+0

आपकी सुझाई गई विधि संकलन त्रुटियों को देती है। –