0

使用 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() 有效

4

0 回答 0