Spring: RestTemplate returns 空对象

Spring: RestTemplate returns null object

使用以下 GET 请求:

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

returns 一个 JSON 这样的字符串:

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

但我想让它与一个对象一起工作,而不是与一个字符串一起工作。因此,通过下面的代码,我收到了一个带有空 UserTokenResponse List

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

我的域 class 如下所示:

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

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

我错过了什么?

假设您使用的是 Jackson,RestTemplate 会自动注册一个 MappingJackson2HttpMessageConverter,它将基础 ObjectMapper 配置为忽略未知属性。

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

它们需要匹配,或者您需要添加属性的 @JsonProperty 注释以使 Jackson serialize/parse 成为 userRegistrations

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

但是如果你的class如下

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

然后你在响应实体中得到预期的响应

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

像那样:

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

问题可能是因为它与我们要转换的 class 不直接兼容。