2011-07-08 47 views
5

Tôi gặp sự cố khi Consume Rest Service with RestTemplate trong Desktop App trong khi vấn đề không xuất hiện khi tôi sử dụng trong ứng dụng Web.Vấn đề khi sử dụng dịch vụ nghỉ ngơi với RestTemplate trong ứng dụng Desktop

This Is các bản ghi gỡ lỗi

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}]" 

Exception in thread "main" java.lang.ClassCastException: java.util.LinkedHashMap không thể được đúc để com.mgm.domain.Country

Và đây là Mã mà tôi sử dụng.

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(); 
    } 

Mã trên không gây ra lỗi khi tôi đặt trong ứng dụng web. Tôi sử dụng Spring Rest MVC để cung cấp JSON và Consume nó với RestTemplate.

Tôi nghĩ có vấn đề khi Jackson chuyển đổi java.util.LinkedHashMap thành Country. Dường như countries.get(0) thực sự có LinkedHashMap loại không Country và vấn đề sẽ xuất hiện khi tôi gọi một trong Country tole như .getName()

+0

cho tất cả: một điểm đến ghi chú khác, RestTemplate nằm trong bình trà mùa xuân. Vì vậy, nó là một phần của dự án web mùa xuân. – Kowser

Trả lời

21

Hãy thử sử dụng một mảng thay vì:

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. Có cùng một vấn đề, sau khi một số nghiên cứu về điều này tôi phát hiện ra giải pháp của bạn, đến đây để trả lời nó, và thấy bạn đánh bại tôi với nó :-) Lý do rõ ràng là bạn không thể vượt qua 'Danh sách .class' để' phương thức exchange() ', vì vậy khi nó unmarshalls nó không có cách nào để biết loại (' Country') 'List' được gõ vào. Mảng có thể được chuyển thành các đối tượng 'Lớp', vì vậy các thông tin kiểu có thể được chuyển tải tới trình gỡ lỗi cơ bản. – SingleShot

+0

có, điều này là do loại hiệu ứng tẩy xoá trong cơ chế generics của Java. Tìm thấy thêm tại đây: http://stackoverflow.com/questions/339699/java-generics-type-erasure-when-and-what-happens chỉ cần thêm 2 xu của tôi –

Các vấn đề liên quan