2013-08-20 45 views
9

我想使用Spring的RestTemplate加Jackson來使用WebService。我遵循了幾個教程,並且已經着手創建DAO。這是我得到的所有我的域對象的方法: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; 

但是我的Web服務不返回車站對象的數組向右走,而是以這種方式更多的語義表達:

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

所以我的問題是,我不知道如何「告訴」RestTemplate在「站點」指示符之後立即解析對象列表,而不創建臨時對象,這似乎不是合適的解決方案。

有什麼方法可以爲RestTemplate指定正確的語法嗎?

編輯:我創建了一個包裝對象是這樣的:

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

但我掙扎於如何使這個對象一般,因爲在JSON響應我的對象列表中的鍵名是依賴的是域對象的類。

回答

4

解決辦法有兩個位置:

  1. 你可以寫自己的解串器的實現,在那裏你解析JSON,並採取僅在站列表,並將其轉換爲列表對象。解串器可以在RestTemplate上設置。看看如何編寫custom desrializer for Jackson
  2. 你可以做的另一件事是編寫一個映射Rest響應的類。這個類應該包含List對象作爲成員變量。然後,默認情況下,Spring會轉換爲新類,並且您可以從該類中獲取站點。

這裏是一個例子。

響應類

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

在REST客戶端

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

第二種解決方案是什麼第一次來到我的腦海裏。但我不想爲每個域對象創建不同的「包裝對象」。這似乎有點「錯誤」。或者也許有一種方法可以製作一個通用的,因爲我的所有REST響應都遵循相同的模式? – MichelReap

+0

如果你的所有響應遵循相同的格式,那麼你可以寫一個通用的響應,其中MyResponseClass包含一個List <?擴展Data>其中Data是Station的超類。這只是一個建議,我不確定Spring如何處理這樣的泛型情況。你需要嘗試一下,並調整你的JSON響應。 –

+0

去Deserializer路由是一個更好的解決方案,但是如果需要隱藏包含站點以外的實體的響應,則需要以通用方式編寫解串器。如果你只有Station,那麼寫一個解串器。 –