2011-07-08 9 views
5

मुझे एक समस्या है जब डेस्कटॉप ऐप में RestTemplate के साथ बाकी सेवा का उपभोग करें, जबकि जब मैं वेब ऐप में उपयोग करता हूं तो समस्या प्रकट नहीं होती है।डेस्कटॉप ऐप में RestTemplate के साथ आराम सेवा का उपभोग करते समय समस्या

यह डिबगिंग लॉग सूत्र में

15:30:40.448 [main] DEBUG o.s.web.client.RestTemplate - Reading [java.util.List] as "application/json" using [org.springf[email protected]98adae2] 
15:30:40.452 [main] DEBUG httpclient.wire.content - << "[{"name":"Indonesia","id":1},{"name":"AlaySia","id":2},{"name":"Autraliya","id":3}]" 

अपवाद नहीं है "मुख्य" java.lang.ClassCastException: java.util.LinkedHashMap com.mgm.domain.Country

में ढाला नहीं जा सकता

और यह वह कोड है जिसका मैं उपयोग करता हूं।

String url = "http://localhost:8080/mgm/country"; 
    List<MediaType> mediaTypes = new ArrayList<MediaType>(); 
    mediaTypes.add(MediaType.APPLICATION_JSON); 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setAccept(mediaTypes); 
    HttpEntity<Country> httpEntity = new HttpEntity<Country>(null, headers); 
    try { 
     ResponseEntity<List> responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, List.class); 
     List<Country> countries = responseEntity.getBody(); 
     System.out.println(countries.get(0).getName()); 

    } catch (RestClientException exception) { 
     exception.printStackTrace(); 
    } 

उपरोक्त कोड त्रुटियों को नहीं देता है जब मैं इसे वेब ऐप में रखता हूं। मैं JSON प्रदान करने के लिए स्प्रिंग रेस्ट एमवीसी का उपयोग करता हूं और इसे RestTemplate के साथ उपभोग करता हूं।

मुझे लगता है कि जैक्सन कनवर्ट java.util.LinkedHashMap से Country पर कोई समस्या है। ऐसा लगता है कि countries.get(0) वास्तव में LinkedHashMap प्रकार नहीं Country है और समस्या दिखाई दिया जाएगा जब मैं की तरह .getName()

+0

वसंत-वेब जार में। तो यह वसंत वेब परियोजना का एक हिस्सा है। – Kowser

उत्तर

21

Country methode में से एक को लागू करने के बजाय एक सरणी का उपयोग कर प्रयास करें: करने के लिए बताया गया है, RestTemplate स्थित है एक बिंदु:

String url = "http://localhost:8080/mgm/country"; 
List<MediaType> mediaTypes = new ArrayList<MediaType>(); 
mediaTypes.add(MediaType.APPLICATION_JSON); 
HttpHeaders headers = new HttpHeaders(); 
headers.setAccept(mediaTypes); 
HttpEntity<Country> httpEntity = new HttpEntity<Country>(null, headers); 
try { 
    ResponseEntity<Country[]> responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, Country[].class); 
    Country[] countries = responseEntity.getBody(); 
    System.out.println(countries[0].getName()); 

} catch (RestClientException exception) { 
    exception.printStackTrace(); 
} 
सभी
+0

+1। इस मुद्दे पर कुछ शोध करने के बाद, मैंने आपके समाधान की खोज की, इसका उत्तर देने के लिए यहां आया, और देखें कि आप मुझे इसे हराते हैं :-) कारण स्पष्ट रूप से यह है कि आप 'सूची .class' को ' एक्सचेंज() 'विधि, इसलिए जब यह अनमशॉल करता है तो इसका नाम टाइप करने के लिए कोई तरीका नहीं है ('देश')' सूची' टाइप किया गया है। Arrays 'कक्षा' वस्तुओं के रूप में पारित किया जा सकता है, तो प्रकार की जानकारी अंतर्निहित unmarshaller को व्यक्त किया जा सकता है। – SingleShot

+0

हां, यह जावा के जेनेरिक तंत्र में प्रकार के प्रभाव प्रभाव के कारण है। यहां अधिक पाए गए: http://stackoverflow.com/questions/339699/java-generics-type-erasure-when-and-what-happens बस मेरे 2 सेंट जोड़ना –

संबंधित मुद्दे