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 不直接兼容。
使用以下 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 不直接兼容。