使用 Spring RestTemplate 的执行方法为:-
RestTemplate template = new RestTemplate();
List<Feed> feeds = template.execute(inApiUrl,
HttpMethod.GET,
new CustomRequestCallback(inEncryptedApiKey),
new CustomResponseExtractor<List<Feed>>());
自定义响应提取器:-
public static class CustomResponseExtractor<T> implements ResponseExtractor<T> {
@Override
public T extractData(ClientHttpResponse inResponse) throws IOException {
String json = IOUtils.toString(inResponse.getBody());
if (StringUtils.isEmpty(json)) {
return null;
}
T data = null;
try {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// THIS IS WHERE THE GENERIC T IS NOT GETTING CAPTURED CORRECTLY
data = objectMapper.readValue(json, new TypeReference<T>(){});
} catch (Exception e) {
LOGGER.error("Error ... ", e);
}
return data;
}
}
响应看起来像: -
[{ "id": 8, "name": "Dev", "writeAccess": true },{ "id": 1, "name": "Default feed", "writeAccess": false }]
提要对象:-
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"id",
"name",
"writeAccess"
})
public class Feed {
@JsonProperty("id")
private Integer _id;
@JsonProperty("name")
private String _name;
@JsonProperty("writeAccess")
private Boolean _writeAccess;
public Integer getId() {
return _id;
}
public void setId(Integer inId) {
_id = inId;
}
public String getName() {
return _name;
}
public void setName(String inName) {
_name = inName;
}
public Boolean getWriteAccess() {
return _writeAccess;
}
public void setWriteAccess(Boolean inWriteAccess) {
_writeAccess = inWriteAccess;
}
}
此设置导致数据为 LinkedHashMap 列表而不是 Feed 列表(自定义对象)
我不是在寻找解决方法。我想知道为什么这不起作用?
注意:将 new TypeReference<List< Feed >>(){} 直接提供给 objectMapper.readValue() 有效