我有一个自定义的通用方法,该方法向URL发出GET
请求,并将JSON响应转换为responseType
对象:
public static <T> Object getForEntity(String url, Class<T> responseType) throws InterruptedException, ExecutionException, IOException{
Response getResponse = callWithHttpGet(url);
String getResponseJson = getResponse.getBody();
ObjectMapper getResponseJsonMapper = new ObjectMapper();
Object obj = getResponseJsonMapper.readValue(getResponseJson, responseType);
return obj;
}
如果我按以下方式调用,则上面的代码可以正常工作:
Object person = getForEntity(PERSON_REST_URL,Person.class);
如何使其按以下方式工作而不是返回对象?
Person person = getForEntity(PERSON_REST_URL, Person.class);
答案 0 :(得分:2)
首先,让方法返回T
而不是Object
:
public static <T> T getForEntity(...)
然后实现它以返回T。readValue
返回正确的类,因为您传入了Class<T>
,并且其签名也等效于public <T> T readValue(..., Class<T> clazz)
,因此您可以这样做:
T obj = getResponseJsonMapper.readValue(getResponseJson, responseType);
return obj;
答案 1 :(得分:1)
您只需传递一个Class<T>
参数。
请注意,您不需要对readValue
方法的响应进行强制类型转换,因为您已经传递了clazz
作为参数,因此它返回了clazz
元素。
您的错误只是将结果分配给了Object类型的对象。比退还了。删除不必要的分配,并直接从调用结果返回到readValue
。
public static <T> T getForEntity(String url, Class<T> clazz) throws InterruptedException,
ExecutionException, IOException {
Response getResponse = callWithHttpGet(url);
String getResponseJson = getResponse.getBody();
ObjectMapper getResponseJsonMapper = new ObjectMapper();
return getResponseJsonMapper.readValue(getResponseJson, clazz);
}
答案 2 :(得分:0)
使用T作为返回参数并进行强制转换(假设可以强制转换-否则会出现运行时异常)。
public static <T> T getForEntity(String url, Class<T> responseType) throws InterruptedException, ExecutionException, IOException{
Response getResponse = callWithHttpGet(url);
String getResponseJson = getResponse.getBody();
ObjectMapper getResponseJsonMapper = new ObjectMapper();
T obj = (T)getResponseJsonMapper.readValue(getResponseJson, responseType);
return obj;
}
在特定情况下,您甚至可以跳过强制转换(如果ObjectMapper已经返回正确的类型,例如Jackson)。