无法获得通用的ResponseEntity <T>,其中T是泛型类"SomeClass <SomeGenericType>"

Igo*_*orA 22 java generics rest spring spring-mvc

请帮我弄一个ResponseEntity<T>地方T本身就是一个泛型类型.正如我现在所看到的,现在春天RestTemplate不支持这个.我正在使用Spring MVC 3.1.2版

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

ResponseEntity<CisResponse<CisResponseEntity>> res =
         this.restTemplate.postForEntity(
             this.rootURL, myRequestObj, CisResponse.class);
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

Type mismatch: cannot convert from ResponseEntity<CisResponse> to
ResponseEntity<CisResponse<CisResponseEntity>>
Run Code Online (Sandbox Code Playgroud)

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

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

CisResponse<CisResponseEntity> myResponse= res.getBody();
CisResponseEntity entity = myResponse.getEntityFromResponse();
Run Code Online (Sandbox Code Playgroud)

现在,我使用这个解决方案,postForObject()而不是postForEntity():

CisResponse<CisResponseEntity> response = 
          this.restTemplate.postForObject(
               this.rootURL,myRequestObj, CisResponse.class);
Run Code Online (Sandbox Code Playgroud)

Raf*_*ele 40

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

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

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

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

顺便说一下,在Java中你不需要使用以下内容对实例变量进行前缀this:如果你的对象定义了一个urltemplate成员,只需用他们的简单名称访问它们,而不是像你那样使用前缀this.urlthis.template