【发布时间】:2020-08-24 18:40:06
【问题描述】:
目前我有以下通用包装器,用于响应我正在使用的其余服务 -
class Response<T> {
private T data;
private boolean success;
...
}
我想使用通用的 Util 方法来使用我从该服务接收到的所有类型的 T data 对象。下面是我目前写的Util方法sn -p -
public <T> List<T> invokeServiceForList(ServiceRequestFactory factory) throws ServiceException {
ResponseEntity<Response<List<T>>> responseEntity = null;
List<T> data = null;
try {
responseEntity = restTemplate.exchange(factory.getUriBuilder().toUriString(), factory.getHttpMethod(), factory.getRequestEntity(), new ParameterizedTypeReference<Response<List<T>>>() {});
if (responseEntity.getBody() != null && !responseEntity.getBody().isSuccess()) {
LOG.error("Response received from service with errors");
throw new Exception("Error");
}
data = responseEntity.getBody().getData();
} catch (Exception e) {
LOG.error("Internal service exception while connecting to service", e);
throw new Exception("Internal Error");
}
return data;
}
我目前正在通过以下方式调用上述方法-
ServiceDelegate delegate = new ServiceDelegate(restTemplate);
List<User> users = delegate.invokeServiceForList(factory);
当我的 T 是一个简单的 POJO(例如 User)时,我将得到一个 ArrayList<LinkedHashMap<String, Object>> 作为此方法的输出,而不是 ArrayList<User>。
理想情况下,我希望委托方法推断类型 User,并且我不想将 ParameterizedTypeReference 作为参数显式传递给此方法。有人能告诉我我在这里做错了什么或者还有什么可以做的吗?
【问题讨论】:
-
在方法中的参数中取
ParameterizedTypeReference值,使其像ParameterizedTypeReference<List<T>> type一样工作,并在调用方法时发送确切的类型引用 -
请告诉我们你是怎么打电话给
invokeServiceForList(ServiceRequestFactory)的? TIA。 -
@deduper
ServiceDelegate delegate = new ServiceDelegate(restTemplate); List<User> users = delegate.invokeServiceForList(factory);这里ServiceDelegate包含invokeServiceForList方法 -
谢谢先生。您是否需要更改
ServiceDelegate.invokeServiceForList(ServiceRequestFactory)的签名? -
@deduper 我可以,如果需要的话。但我不希望按照 Rono 的建议添加 ParameterizedTypeReference 作为参数。任何其他可以直接推断对象类型的替代方法对我来说真的很有帮助。提前致谢
标签: java spring-boot generics resttemplate