无法获得通用的ResponseEntity <t>,其中T是泛型类“SomeClass <somegenerictype>”</somegenerictype> </t>

时间:2012-12-11 11:47:32

标签: java spring rest generics spring-mvc

请帮助我获得ResponseEntity<T> T本身就是一般类型。正如我现在所看到的,现在春天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);

1 个答案:

答案 0 :(得分:37)

这是a known issue。现在通过引入ParameterizedTypeReference来修复它,这是一个参数化类型,您明确地继承以在运行时提供类型信息。这称为超类型令牌,并且可以解决类型擦除问题,因为子类(在本例中是anoniymous)在运行时保留泛型超类型类型参数。

但是,您无法使用postForObject,因为API仅支持exchange()

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

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

BTW,在Java中,您不需要使用this对实例变量的访问加前缀:如果您的对象定义了urltemplate成员,只需使用简单名称访问它们,而不是像this.urlthis.template

那样加前缀