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響應我的對象列表中的鍵名是依賴的是域對象的類。
第二種解決方案是什麼第一次來到我的腦海裏。但我不想爲每個域對象創建不同的「包裝對象」。這似乎有點「錯誤」。或者也許有一種方法可以製作一個通用的,因爲我的所有REST響應都遵循相同的模式? – MichelReap
如果你的所有響應遵循相同的格式,那麼你可以寫一個通用的響應,其中MyResponseClass包含一個List <?擴展Data>其中Data是Station的超類。這只是一個建議,我不確定Spring如何處理這樣的泛型情況。你需要嘗試一下,並調整你的JSON響應。 –
去Deserializer路由是一個更好的解決方案,但是如果需要隱藏包含站點以外的實體的響應,則需要以通用方式編寫解串器。如果你只有Station,那麼寫一個解串器。 –