Java Spring RestTemplate:如何在泛型类中定义参数类型
我正在编写一个通用的REST客户端,用于不同类型的DTOJava 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
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
}
}