web-dev-qa-db-ja.com

Spring:RestTemplateはnullオブジェクトを返します

以下のGETリクエストで:

ResponseEntity<String> entity = restTemplate.exchange(uri, HttpMethod.GET, requestEntity, String.class );
entity.getBody();

次のようなJSON文字列を返します。

{"userRegistrations":[{"userRegistrationToken":"fb398972","userRegistrationTokenAlias":"87f15f8"}]}

しかし、私はこれを文字列ではなくオブジェクトで機能させたいと思っています。したがって、以下のコードを使用すると、UserTokenResponseリストがnullのUserRegistrationsオブジェクトを受け取ります。

ResponseEntity<UserRegistrations> entity = restTemplate.exchange(uri, HttpMethod.GET, requestEntity, UserRegistrations.class );
entity.getBody();

そして、私のドメインクラスは次のようになります。

public class UserRegistrations {
    List<UserTokenResponse> userRegistrationList;
    //..getters and setters
}

public class UserTokenResponse {
   private String userRegistrationToken;
   private String userRegistrationTokenAlias;
   //getters and setters
}

何が足りないのですか?

6
Spring

Jacksonを使用しているとすると、RestTemplateは自動的にMappingJackson2HttpMessageConverterを登録し、不明なプロパティを無視するように基になるObjectMapperを構成します。

JSONオブジェクトにはuserRegistrationsという名前の単一の属性がありますが、JavaクラスにはuserRegistrationListという名前の単一の属性があります。これらは一致しません。

それらは一致する必要があります。または、属性の@JsonPropertyアノテーションを追加して、Jacksonが属性をuserRegistrationsとしてシリアル化/解析するようにする必要があります。

3
JB Nizet

これは、クラスのプロパティ名が応答に含まれるJSONプロパティ名と一致しない場合に発生します。たとえば、以下の例を見てください

    public class ScheduledCallbacks {

    private List<Callback> callbacks;

    public List<Callback> getCallbacks() {
        return callbacks;
    }

    public void setCallbacks(List<Callback> callbacks) {
        this.callbacks = callbacks;
    }

    @Override
    public String toString() {
        return "ScheduledCallbacks [callbacks=" + callbacks + "]";
    }
}

応答が次の場合

{
  "scheduledCallbacks": [
    {
      "sessionId": "string",
      "customerNbr": "string",
      "topicName": "string",
      "desiredTime": "string",
      "callbackState": "string",
      "serviceName": "string",
      "expirationTime": "string",
      "programCode": "string"
    }
  ]
}

次に、JSON応答の名前scheduledCallbacksがクラスの名前コールバックと一致しないため、null応答が返されます。

ただし、クラスが次の場合

public class ScheduledCallbacks {

    private List<Callback> scheduledCallbacks;

    public List<Callback> getScheduledCallbacks() {
        return scheduledCallbacks;
    }
    public void setScheduledCallbacks(List<Callback> scheduledCallbacks) {
        this.scheduledCallbacks = scheduledCallbacks;
    }
    @Override
    public String toString() {
        return "ScheduledCallbacks [scheduledCallbacks=" + scheduledCallbacks + "]";
    }
}

次に、応答エンティティで期待される応答を取得します

0