Spring:RestTemplate返回null对象

时间:2016-12-14 18:18:04

标签: java spring resttemplate

使用以下GET请求:

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

返回一个像这样的JSON字符串:

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

但我想用一个没有字符串的对象来完成这个工作。因此,使用下面的代码,我收到一个UserRegistrations对象,其中包含一个null UserTokenResponse List

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

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

我的域类看起来像这样:

{{1}}

我错过了什么?

3 个答案:

答案 0 :(得分:2)

假设您正在使用Jackson,RestTemplate会自动注册一个MappingJackson2HttpMessageConverter,用于配置基础ObjectMapper以忽略未知属性。

JSON对象有一个名为userRegistrations的属性,而您的Java类有一个名为userRegistrationList的属性。他们不匹配。

他们需要匹配,或者您需要添加属性的@JsonProperty注释,以使Jackson序列化/解析为userRegistrations

答案 1 :(得分:0)

当您的类属性名称与响应中出现的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与类中的名称回调不匹配。

但是如果您的班级如下

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 + "]";
    }
}

然后您将在响应实体中获得预期的响应

答案 2 :(得分:0)

我遇到了类似的错误,它也返回null。当将Object.class替换为我们要在客户端上转换的类的名称时,问题就解决了。

喜欢:

Token = restTemplate.exchange(uri, HttpMethod.POST, request, Object.class);

问题可能是由于它与我们要转换的类不直接兼容。