2013-08-20 21 views
9

Tôi muốn sử dụng RestTemplate của Spring cùng với Jackson để tiêu thụ một WebService. Tôi đã theo một số hướng dẫn và đã đến điểm tạo DAO. Đây là phương pháp mà tôi nhận được tất cả các đối tượng tên miền của tôi:RestTemplate + Jackson

// Create a Rest template 
RestTemplate restTemplate = new RestTemplate(); 

// Create a list for the message converters 

List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>(); 

// Add the Jackson Message converter 
messageConverters.add(new MappingJacksonHttpMessageConverter()); 

// Add the message converters to the restTemplate 
restTemplate.setMessageConverters(messageConverters); 

List<Station> resultList = Arrays.asList(restTemplate.getForObject(BASE_URL, Station[].class)); 

return resultList; 

Nhưng Web Service của tôi không trả lại một mảng của Trạm đối tượng ngay lập tức, mà đúng hơn là một biểu ngữ nghĩa hơn theo cách này:

{"success":true,"message":"Records Retrieved Successfully","data":{"totalCount":"14","stations":[{"id":"1264","station":"Station 1","idJefatura":"1","syncDate":"2013-01-24 13:20:43"}, ...] }} 

Vì vậy, vấn đề của tôi là, tôi không chắc làm thế nào để "nói" RestTemplate để phân tích danh sách đối tượng ngay sau chỉ báo "trạm", mà không tạo một đối tượng quảng cáo, mà dường như không phải là giải pháp thích hợp.

Có cách nào để chỉ định cú pháp đúng cho RestTemplate không?

EDIT: Tôi tạo ra một đối tượng wrapper như thế này:

public class RestResponseObject { 

    private boolean success; 
    private String message; 
    private Data data; 

    public Data getData() { 
     return data; 
    } 

    public void setData(Data data) { 
     this.data = data; 
    } 

    public boolean isSuccess() { 
     return success; 
    } 

    public void setSuccess(boolean success) { 
     this.success = success; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    public class Data { 
     private int totalCount; 
     private List<Station> stations; 

     public int getTotalCount() { 
      return totalCount; 
     } 

     public void setTotalCount(int totalCount) { 
      this.totalCount = totalCount; 
     } 

     public List<Station> getStations() { 
      return stations; 
     } 

     public void setStations(List<Station> estaciones) { 
      this.stations= estaciones; 
     } 
    } 
} 

Nhưng tôi đang gặp khó khăn như thế nào để làm cho đối tượng này chung chung, vì tên chủ chốt của danh sách đối tượng của tôi trong phản ứng JSON là phụ thuộc mà lớp đối tượng miền.

Trả lời

4

Có hai giải pháp ở đây:

  1. Bạn có thể viết thực hiện deserializer của riêng bạn, nơi bạn phân tích JSON và chỉ mất danh mục kênh và chuyển nó sang các đối tượng List. Deserializer có thể được đặt trên RestTemplate. Hãy xem cách viết custom desrializer for Jackson
  2. Điều khác bạn có thể làm là viết một lớp ánh xạ phản hồi còn lại. Lớp này nên chứa đối tượng List làm biến thành viên. Sau đó, Spring theo mặc định sẽ chuyển đổi sang lớp mới và bạn có thể lấy các trạm từ lớp đó.

Dưới đây là ví dụ.

Lớp phản ứng

public class MyResponseClass { 
     // other variables 
    private List<Station> stations; //it getters and setters 
} 

Trong

MyResponseClass response = restTemplate.getForObject(BASE_URL, MyResponseClass.class) 
List<Station> resultList = response.getStations() 
+0

Giải pháp thứ hai Nghỉ ngơi Khách hàng là những gì đầu tiên lóe lên trong óc tôi. Nhưng tôi không muốn tạo một "đối tượng gói" khác cho từng đối tượng miền của tôi. Nó có vẻ hơi "sai". Hoặc có thể có một cách để tạo một cái chung, vì tất cả các phản hồi REST của tôi đều theo cùng một mẫu? – MichelReap

+0

Nếu tất cả các câu trả lời của bạn theo cùng một định dạng thì bạn có thể viết một phản hồi chung nơi MyResponseClass chứa một Danh sách trong đó Dữ liệu là lớp siêu cho Trạm. Đây chỉ là một gợi ý, tôi không chắc Spring sẽ xử lý các trường hợp chung như thế này. Bạn cần phải thử nó ra và làm cho tinh chỉnh phản ứng JSON của bạn cũng có. –

+0

Đi tuyến Deserializer là một giải pháp tốt hơn, nhưng sau đó bạn sẽ cần phải viết deserializer một cách chung chung, nếu bạn cần phải bí mật trả lời có chứa các thực thể khác hơn là Ga. Nếu bạn chỉ có Station, sau đó viết một deserializer cho điều đó. –

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