2012-12-11 31 views
18

कृपया मुझे ResponseEntity<T> प्राप्त करने में सहायता करें, जहां T स्वयं एक सामान्य प्रकार है। जैसा कि मैंने इसे अभी देखा है, यह वसंत RestTemplate द्वारा आजकल समर्थित नहीं है। मैं वसंत MVC संस्करण का उपयोग कर रहा हूँ 3.1.2एक सामान्य प्रतिक्रिया प्राप्त करने में असमर्थ <T> जहां टी एक सामान्य वर्ग "SomeClass <SomeGenericType>"

यहाँ मेरी कोड है, कि मैं का उपयोग करना चाहते: कोड:

ResponseEntity<CisResponse<CisResponseEntity>> res = 
     this.restTemplate.postForEntity(
      this.rootURL, myRequestObj, CisResponse.class); 

मैं इस त्रुटि हो रही है:

Type mismatch: cannot convert from ResponseEntity<CisResponse> to 
ResponseEntity<CisResponse<CisResponseEntity>> 

यह स्पष्ट त्रुटि, लेकिन मैं आज इसे कैसे काम कर सकता हूं?

से मैं अपने सामान्य प्रतिक्रिया प्रकार प्राप्त करना चाहते हैं:

CisResponse<CisResponseEntity> myResponse= res.getBody(); 
CisResponseEntity entity = myResponse.getEntityFromResponse(); 

अभी के लिए, मैं postForObject() और postForEntity() नहीं के साथ इस समाधान का उपयोग:

CisResponse<CisResponseEntity> response = 
      this.restTemplate.postForObject(
       this.rootURL,myRequestObj, CisResponse.class); 

उत्तर

31

यह a known issue था। अब यह ParameterizedTypeReference की शुरुआत के साथ तय किया गया है, जो एक पैरामीटर प्रकार है जिसे आप स्पष्ट रूप से रनटाइम पर प्रकार की जानकारी प्रदान करने के लिए प्राप्त करते हैं। इसे सुपर-टाइप टोकन कहा जाता है, और टाइप एरर के आसपास काम करता है क्योंकि उप-वर्ग (इस मामले में anoniymous) रनटाइम पर जेनेरिक सुपरटेप के तर्कों को टाइप करते हैं।

हालांकि आप, postForObject उपयोग नहीं कर सकते केवल API exchange() का समर्थन करता है क्योंकि:

ResponseEntity<CisResponse<CisResponseEntity>> res = template.exchange(
     rootUrl, 
     HttpMethod.POST, 
     null, 
     new ParameterizedTypeReference<CisResponse<CisResponseEntity>>() {}); 

ध्यान दें कि अंतिम पंक्ति super type tokens के विचार को दर्शाता है: आप शाब्दिक CisResponse.class की आपूर्ति नहीं है, लेकिन एक गुमनाम इन्स्टेन्शियशन पैरामीटर प्रकार ParameterizedTypeReference<T>, जो रनटाइम पर उप प्रकार की जानकारी निकालने की उम्मीद की जा सकती है। तुम्हें पता है, BTW Foo<Bar<Baz>>.class

को प्राप्त करने जावा में आप this साथ उदाहरण चर के लिए उपयोग उपसर्ग की जरूरत नहीं है के लिए हैक्स के रूप में सुपर प्रकार टोकन के बारे में सोच सकते हैं: अगर आपके वस्तु एक url और template सदस्यों को परिभाषित करता है, बस उनके साथ का उपयोग उनका सरल नाम, और this.url और this.template

+0

आश्चर्यजनक, आपने अपना दिन बनाया !! – IgorA