SpringのRestTemplateとJacksonを使用してWebサービスを利用したいと思います。私はいくつかのチュートリアルに従い、DAOを作成するところまで来ました。これは、すべてのドメインオブジェクトを取得する方法です。
// 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サービスは、Stationオブジェクトの配列をすぐには返しませんが、次のように、よりセマンティックな式を返します。
{"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応答のオブジェクトリストのキー名はそのドメインオブジェクトのクラスに依存しているため、このオブジェクトを汎用にする方法については苦労しています。
ここには2つの解決策があります。
これが例です。
応答クラス
public class MyResponseClass {
// other variables
private List<Station> stations; //it getters and setters
}
残りのクライアントで
MyResponseClass response = restTemplate.getForObject(BASE_URL, MyResponseClass.class)
List<Station> resultList = response.getStations()