当前位置: 首页 > 面试题库 >

在具有通用参数的通用方法中使用Spring RestTemplate

顾涵衍
2023-03-14
问题内容

要在Spring RestTemplate中使用泛型类型,我们需要使用ParameterizedTypeReference(无法获得泛型ResponseEntity <T>,其中T是泛型类“ 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错误吗?

我了解这个概念。不幸的是我是在这里新注册的,所以我无法评论他的答案,所以在这里写下。林不知道,我清楚地了解如何实现所提出的方法来解决我的问题与Map使用Class密钥(由@Sotirios在他的回答最后提出)。有人愿意举一个例子吗?


问题答案:

不,这不是错误。这是ParameterizedTypeReference黑客工作方式的结果。

如果看一下它的实现,它会使用Class#getGenericSuperclass()哪些状态

返回表示该类表示的实体的直接超类的Type(class, interface, primitive type or void)。

如果超类是参数化类型,则Type返回的对象必须准确反映源代码中使用的实际类型参数。

所以,如果你使用

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

它将准确地返回Typefor ResponseWrapper<MyClass>

如果你使用

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

它会准确地返回Typefor,ResponseWrapper<T>因为那是它在源代码中的样子。

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

你不能使用ParameterizedTypeReference提议的方式,就接受任何类型的意义而言,使其成为通用的。考虑编写映射到该类的预定义Map键的with键。ClassParameterizedTypeReference

你也可以继承ParameterizedTypeReference并覆盖其getType方法返回一个适当的创建ParameterizedType,通过IonSpin的建议。



 类似资料:
  • 问题内容: 我对包含不带参数的泛型方法的代码感到困惑,所以这种方法的返回泛型类型是什么,例如: 这是通过以下方式调用的: 接口定义为: 我的问题:是否接受字符串,对象和所有内容。那么什么时候将通用返回类型指定为String呢? 问题答案: 编译器从 LHS 分配中使用的具体类型推断出类型。 从此链接: 如果类型参数未出现在方法参数的类型中,则编译器无法通过检查实际方法参数的类型来推断类型参数。如果

  • 问题内容: 我需要帮助使此类型适用于任何类型。 我有一个函数,我需要接受具有属性的其他类型。 我尝试使用接口,但不适用于我的财产情况。这是代码: 我明白了 错误prog.go:39:在Count的参数中无法将人类([人类]类型)用作[]哺乳动物 有关更多详细信息,请参见Go Playground,网址为http://play.golang.org/p/xzWgjkzcmH 问题答案: 使用接口而不

  • 问题内容: 有没有一种使用通用参数模拟类的干净方法?说我必须模拟一个类,我需要将该类传递给需要一个的方法。我可以很容易地做到以下几点: 假定返回通用类型。但是,当我稍后将其传递给期望的方法时,将会有小猫。铸造是这样做的唯一方法吗? 问题答案: 我认为您确实需要强制转换,但应该不会太糟:

  • 问题内容: 假设您有: 现在显然声明一是执行此操作的正确方法,并且在声明二上收到编译错误。我想知道为什么Java选择以这种特定方式强制执行类型安全。如果“猫”列表仍然是“动物”列表,那么为什么期望有动物列表的方法却拒绝接收一堆猫呢? 好奇心比什么都重要-并有机会更好地完善我的知识。 干杯,戴夫。 问题答案: Java泛型不是 协变的 。如果可以这样做: 那么您将能够执行以下操作: 这违反了只能容纳

  • 我有一个方法如下: 为了通过反射调用此函数,我尝试了以下代码段,但结果不成功: 那么,有没有一种方法可以通过Java反射调用像findEntity这样的方法? 谢谢

  • 我想要的:我在下面试过了,但它不起作用。