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

无法获取通用ResponseEntity 其中T是泛型类“ SomeClass”

端木昱
2023-03-14
问题内容

请帮助我获得一个ResponseEntity<T>where T本身就是一个泛型类型。如我现在所见,Spring
RestTemplate现在不支持此功能。我正在使用Spring MVC版本3.1.2

这是我要使用的代码:代码:

ResponseEntity<CisResponse<CisResponseEntity>> res =
         this.restTemplate.postForEntity(
             this.rootURL, myRequestObj, CisResponse.class);

我收到此错误:

Type mismatch: cannot convert from ResponseEntity<CisResponse> to
ResponseEntity<CisResponse<CisResponseEntity>>

这是明显的错误,但是今天如何解决呢?

比我想得到我的通用响应类型:

CisResponse<CisResponseEntity> myResponse= res.getBody();
CisResponseEntity entity = myResponse.getEntityFromResponse();

现在,我使用此解决方案,postForObject()并且不使用postForEntity()

CisResponse<CisResponseEntity> response = 
          this.restTemplate.postForObject(
               this.rootURL,myRequestObj, CisResponse.class);

问题答案:

这是一个已知问题。现在,通过引入修复了此问题ParameterizedTypeReference,您可以显式
继承 该参数化类型,以便在运行时提供类型信息。这称为 超类型令牌 ,它可解决类型擦除,因为子类(在这种情况下为匿名)在运行时保留
通用超类型类型参数

但是,您不能使用postForObject,因为该API仅支持exchange()

ResponseEntity<CisResponse<CisResponseEntity>> res = template.exchange(
        rootUrl,
        HttpMethod.POST,
        null,
        new ParameterizedTypeReference<CisResponse<CisResponseEntity>>() {});

请注意,最后一行演示了超级类型令牌的概念:您不提供文字CisResponse.class,而是提供参数化类型的匿名实例化ParameterizedTypeReference<T>,可以在运行时提取其子类型信息。您可以将超级类型令牌视为实现目标的
技巧Foo<Bar<Baz>>.class

顺便说一句,在Java中,您不需要使用以下前缀对实例变量进行访问this:如果您的对象定义了urltemplate成员,则只需使用其简单名称即可访问它们,而不必像您这样做时那样通过前缀this.urlthis.template



 类似资料:
  • 目前,我使用这个解决方案,使用,而不是:

  • 问题内容: 请帮助我得到一个where 本身就是一个泛型类型。如我现在所见,Spring RestTemplate现在不支持此功能。我正在使用Spring MVC版本3.1.2 这是我要使用的代码:代码: 我收到此错误: 这是明显的错误,但是今天如何解决呢? 比我想得到我的通用响应类型: 现在,我使用此解决方案,并且不使用: 问题答案: 通过引入修复了该问题,你可以显式继承该参数化类型,以便在运行

  • 我使用的是Azure.data.tables nuget包的12.0.0-beta.6。当我尝试调用TableClient.GetQueryAsync时,它会给出错误: “类型”T“必须是引用类型,才能将其用作泛型类型或方法”TableClient.GetEntityAsync(string,string,IEnumerable,CancellationToken)“中的参数”T“。” 我看不出我

  • 问题内容: 我有一个抽象类: 我需要充实的孩子-每个孩子都有自己的孩子 我只找到一种解决方案,但需要编译器参数 这是最好的解决方案吗?没有我们可以做同样的事情吗? 问题答案: 实现此目的的类型安全但很简单的方法是传递令牌“编译器可以看到它的位置”: 如果您执行的是未经检查的强制转换,但您“知道自己在做什么”,并且希望编译器停止抱怨,则正确的方法是将非类型安全但您知道它们的工作位本地化。使用: (我

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • 我的问题标题有点模糊,但本质上我想实现以下几点: struct Foo实现行为A和行为B和行为C 结构栏实现行为A Foo和Bar都实现了一些Content特性 从一个