Java Spring RestTemplate:如何在泛型类中定义参数类型

Java Spring RestTemplate:如何在泛型类中定义参数类型,java,spring,generics,resttemplate,Java,Spring,Generics,Resttemplate,我正在编写一个通用的REST客户端,用于不同类型的DTO public abstract class GenericClient<DTO> { private final Class<DTO> dtoClass; ... ctor which sets dtoClass ... public DTO getOne(String id) { ... URI uri = ... ResponseEntity<DTO> exch

我正在编写一个通用的REST客户端,用于不同类型的DTO

public abstract class GenericClient<DTO> {
  private final Class<DTO> dtoClass;
  ... ctor which sets dtoClass ...

  public DTO getOne(String id) {
    ...
    URI uri = ...
    ResponseEntity<DTO> exchange = getRestTemplate()
      .exchange(uri, HttpMethod.GET, entity, dtoClass);
    return exchange.getBody(); // works
  }

  public List<DTO> findAll() {
    ...
    URI uri = ...
    ResponseEntity<List<DTO>> exchange = getRestTemplate()
      .exchange(uri, HttpMethod.GET, entity, new ParameterizedTypeReference<List<DTO>() {});
    return exchange.getBody(); // fails with ClassCastException
  }
}
公共抽象类GenericClient{
私有最终类dtoClass;
…设置dtoClass的ctor。。。
公共数据到getOne(字符串id){
...
URI=。。。
ResponseEntity exchange=getRestTemplate()
.exchange(uri、HttpMethod.GET、entity、dtoClass);
return exchange.getBody();//有效
}
公共列表findAll(){
...
URI=。。。
ResponseEntity exchange=getRestTemplate()

.exchange(uri,HttpMethod.GET,entity,new ParameterizedTypeReference因此我找到了一个解决方案,它覆盖
ParameterizedTypeReference的
getType
方法,返回自定义的
ParameterizedTypeReference
,如下所示:

public abstract class GenericClient<DTO> {
  private final Class<DTO> dtoClass;
  ... ctor which sets dtoClass ...


  public List<DTO> findAll() {
    ...
    URI uri = ...
    ResponseEntity<List<DTO>> exchange = getRestTemplate()
      .exchange(uri, HttpMethod.GET, entity, new ParameterizedTypeReference<List<DTO>() {
        @Override
        public Type getType() {
            return new ParameterizedType() {
                @Override
                public Type getRawType() {
                    return List.class;
                }

                @Override
                public Type getOwnerType() {
                    return null;
                }

                @Override
                public Type[] getActualTypeArguments() {
                    return new Type[]{dtoClass};
                }
            };
        });
    return exchange.getBody(); // OK
  }
}
公共抽象类GenericClient{
私有最终类dtoClass;
…设置dtoClass的ctor。。。
公共列表findAll(){
...
URI=。。。
ResponseEntity exchange=getRestTemplate()
.exchange(uri、HttpMethod.GET、实体、新参数化类型引用
public abstract class GenericClient<DTO> {
  private final Class<DTO> dtoClass;
  ... ctor which sets dtoClass ...


  public List<DTO> findAll() {
    ...
    URI uri = ...
    ResponseEntity<List<DTO>> exchange = getRestTemplate()
      .exchange(uri, HttpMethod.GET, entity, new ParameterizedTypeReference<List<DTO>() {
        @Override
        public Type getType() {
            return new ParameterizedType() {
                @Override
                public Type getRawType() {
                    return List.class;
                }

                @Override
                public Type getOwnerType() {
                    return null;
                }

                @Override
                public Type[] getActualTypeArguments() {
                    return new Type[]{dtoClass};
                }
            };
        });
    return exchange.getBody(); // OK
  }
}