web-dev-qa-db-ja.com

RestTemplate +ジャクソン

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応答のオブジェクトリストのキー名はそのドメインオブジェクトのクラスに依存しているため、このオブジェクトを汎用にする方法については苦労しています。

9
MichelReap

ここには2つの解決策があります。

  1. JSONを解析し、ステーションリストのみを取得して、それをListオブジェクトに変換する、独自のDeserializer実装を作成できます。デシリアライザーはRestTemplateで設定できます。書き方を見てください ジャクソンのカスタムdesrializer
  2. 他にできることは、Rest応答をマップするクラスを作成することです。このクラスには、Listオブジェクトがメンバー変数として含まれている必要があります。その後、Springはデフォルトで新しいクラスに変換され、そのクラスからステーションを取得できます。

これが例です。

応答クラス

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()
4