一尘不染

Spring RestTemplate和泛型类型ParameterizedTypeReference集合(如List)

spring-mvc

Abstract控制器类需要REST中的对象列表。在使用Spring RestTemplate时,它没有将其映射到必需的类,而是返回Linked
HashMAp

 public List<T> restFindAll() {

    RestTemplate restTemplate = RestClient.build().restTemplate();
    ParameterizedTypeReference<List<T>>  parameterizedTypeReference = new ParameterizedTypeReference<List<T>>(){};
    String uri= BASE_URI +"/"+ getPath();

    ResponseEntity<List<T>> exchange = restTemplate.exchange(uri, HttpMethod.GET, null,parameterizedTypeReference);
    List<T> entities = exchange.getBody();
    // here entities are List<LinkedHashMap>
    return entities;

}

如果我用

ParameterizedTypeReference<List<AttributeInfo>>  parameterizedTypeReference = 
    new ParameterizedTypeReference<List<AttributeInfo>>(){};
    ResponseEntity<List<AttributeInfo>> exchange =
  restTemplate.exchange(uri, HttpMethod.GET, null,parameterizedTypeReference);

工作正常。但是不能放入所有子类中的任何其他解决方案。


阅读 3886

收藏
2020-06-01

共1个答案

一尘不染

我使用以下通用方法解决了这个问题:

public <T> List<T> exchangeAsList(String uri, ParameterizedTypeReference<List<T>> responseType) {
    return restTemplate.exchange(uri, HttpMethod.GET, null, responseType).getBody();
}

然后我可以打电话给:

List<MyDto> dtoList = this.exchangeAsList("http://my/url", new ParameterizedTypeReference<List<MyDto>>() {});

这确实给调用者增加了调用时必须指定的负担ParameterizedTypeReference,但是这意味着我不必像vels4j的回答中那样保持类型的静态映射。

2020-06-01