java - 无法获取泛型 ResponseEntity<T>,其中 T 是泛型类 "SomeClass<SomeGenericType>"

标签 java spring rest generics spring-mvc

请帮我获取 ResponseEntity<T>在哪里 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);

最佳答案

这是 a known issue .现在它已通过引入 ParameterizedTypeReference 得到修复,这是一种参数化类型,您明确继承以在运行时提供类型信息。这称为父类(super class)型标记,可以解决类型删除问题,因为子类(在这种情况下是匿名的)在运行时保留通用父类(super class)型的类型参数

但是你不能使用 postForObject , 因为 API 只支持 exchange() :

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

请注意,最后一行演示了 super type tokens 的思想。 :您不提供文字 CisResponse.class , 而是参数化类型 ParameterizedTypeReference<T> 的匿名实例化,它可以在运行时提取子类型信息。您可以将父类(super class)型标记视为实现Foo<Bar<Baz>>.classhacks

顺便说一句,在 Java 中,您不需要在访问实例变量前加上 this : 如果你的对象定义了 urltemplate成员,只需使用他们的简单名称访问他们,而不是像您一样通过前缀 this.urlthis.template

关于java - 无法获取泛型 ResponseEntity<T>,其中 T 是泛型类 "SomeClass<SomeGenericType>",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13819734/

相关文章:

java - Spring 在 Java 类中单击按钮

java - 如何使用 REST API 更新 ALM 中测试用例的状态

rest - 在 Swagger 规范中表示时间(无日期)的最佳方式

java - readObjectNoData 何时被调用

java - Android 不接受根 CA 证书

java - thymeleaf 值到 html 选择输入

java - 如何使用 Jackson API 从 json 更新现有对象列表

java - 如何使用 token 安全地连接到 RESTHeart

java - 转换 Map<Integer, Set<Object>>

java - 如何实现可移植的 JPA isDirty() 方法?