【发布时间】:2014-03-26 02:06:52
【问题描述】:
要在 Spring RestTemplate 中使用泛型类型,我们需要使用 ParameterizedTypeReference (Unable to get a generic ResponseEntity<T> where T is a generic class "SomeClass<SomeGenericType>")
假设我有一些课
public class MyClass {
int users[];
public int[] getUsers() { return users; }
public void setUsers(int[] users) {this.users = users;}
}
还有一些包装类
public class ResponseWrapper <T> {
T response;
public T getResponse () { return response; }
public void setResponse(T response) {this.response = response;}
}
所以,如果我尝试做这样的事情,一切都很好。
public ResponseWrapper<MyClass> makeRequest(URI uri) {
ResponseEntity<ResponseWrapper<MyClass>> response = template.exchange(
uri,
HttpMethod.POST,
null,
new ParameterizedTypeReference<ResponseWrapper<MyClass>>() {});
return response;
}
但是当我尝试创建上述方法的通用变体时...
public <T> ResponseWrapper<T> makeRequest(URI uri, Class<T> clazz) {
ResponseEntity<ResponseWrapper<T>> response = template.exchange(
uri,
HttpMethod.POST,
null,
new ParameterizedTypeReference<ResponseWrapper<T>>() {});
return response;
}
...并像这样调用此方法...
makeRequest(uri, MyClass.class)
... 而不是得到ResponseEntity<ResponseWrapper<MyClass>> 对象我得到ResponseEntity<ResponseWrapper<LinkedHashSet>> 对象。
我该如何解决这个问题?是 RestTemplate 错误吗?
更新 1
感谢@Sotirios,我理解了这个概念。不幸的是,我刚在这里注册,所以我无法评论他的答案,所以在这里写。我不确定我是否清楚地了解如何使用Map 和Class 键(由@Sotirios 在他的回答末尾提出)解决我的问题。有人介意举个例子吗?
【问题讨论】:
-
您应该始终能够评论您的问题的答案。建议的解决方案是这样工作的。您创建一个
Map<Class, ParameterizedTypeReference<ResponseWrapper<?>>>。您将预构建的ParameterizedTypeReference实例添加到您期望的实际类型的Map对应的Class。 -
@SotiriosDelimanolis - 你能为刚接触 Java 的人改写一下吗?我来自 C# 背景,所以这对我来说是非常有趣的经历。
标签: java spring generics jackson resttemplate