gpt4 book ai didi

java - Spring RestTemplate : how to define the parameter type in a generic class

转载 作者:行者123 更新时间:2023-12-01 09:02:23 25 4
gpt4 key购买 nike

我正在编写一个通用 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
}
}

这是由几个像这样的具体客户端实现的

public class OneActualDTOClient extends GenericClient<OneActualDTO> {
public OneActualDTOClient(){
super(OneActualDTO.class);
}
}

编译成功,getOne方法效果很好。但对于findAll ,在运行时,类型参数DTO不可用,因此exchange方法无法反序列化传入的 JSON(据我所知)。

如您所见,我传递了具体的 DTO 类(作为 Class<DTO> )以与单个元素的交换一起使用( getOne )。

我应该如何将 ParameterizedTypeReference 传递给 exchange方法,以便在运行时它知道返回为 List<OneActualDTO>

最佳答案

所以我找到了一个解决方案,那就是重写 ParameterizedTypeReferencegetType 方法,返回自定义的 ParameterizedType,如下所示:

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
}
}

关于java - Spring RestTemplate : how to define the parameter type in a generic class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41571765/

25 4 0