29

请帮我弄明白ResponseEntity<T>whereT本身就是一个泛型类型。正如我现在所看到的,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);
4

1 回答 1

46

这是一个已知问题。现在它通过引入 来修复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: 如果您的对象定义了 aurltemplate成员,则只需使用它们的简单名称访问它们,而不是像您一样使用前缀this.urlthis.template

于 2012-12-11T12:36:54.697 回答