gpt4 book ai didi

java - 在带有泛型参数的泛型方法中使用 Spring RestTemplate

转载 作者:行者123 更新时间:2023-12-01 16:15:22 25 4
gpt4 key购买 nike

要将泛型类型与 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,我理解了这个概念。不幸的是我是新注册的,所以我不能评论他的答案,所以写在这里。我不确定我是否清楚地理解如何实现建议的方法来解决我的问题 MapClass key(由@Sotirios 在他的答案末尾提出)。有人介意举个例子吗?

最佳答案

不,这不是一个错误。这是 ParameterizedTypeReference 的结果黑客作品。

如果你看看它的实现,它使用 Class#getGenericSuperclass() 其中指出

Returns the Type representing the direct superclass of the entity (class, interface, primitive type or void) represented by this Class.

If the superclass is a parameterized type, the Type object returned must accurately reflect the actual type parameters used in the source code.

所以,如果你使用

new ParameterizedTypeReference<ResponseWrapper<MyClass>>() {}

它将准确返回 Type对于 ResponseWrapper<MyClass>

如果您使用

new ParameterizedTypeReference<ResponseWrapper<T>>() {}

它将准确返回 Type对于 ResponseWrapper<T>因为这就是它在源代码中的显示方式。

当 Spring 看到 T ,实际上是 TypeVariable对象,它不知道要使用的类型,因此它使用默认类型。

您不能使用ParameterizedTypeReference您提议的方式,使其在接受任何类型的意义上通用。考虑写一个 Map带 key Class映射到预定义的ParameterizedTypeReference对于该类。

您可以子类化 ParameterizedTypeReference并覆盖其 getType方法返回适当创建的 ParameterizedType , as suggested by IonSpin .

关于java - 在带有泛型参数的泛型方法中使用 Spring RestTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62408774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com