无法获取通用ResponseEntity 其中T是一个通用类“SomeClass的 ”(U

2019-07-04 23:20发布

请帮我拿到ResponseEntity<T>其中T本身就是一个泛型类型。 正如我所看到的现在,这不是nowdays弹簧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);

Answer 1:

这是一个已知的问题 。 现在,它的固定与引进的ParameterizedTypeReference ,这是一个参数化类型,你明确地继承在运行时提供类型信息。 这就是所谓的超类型令牌 ,和周围型擦除工作,因为子类(anoniymous在这种情况下) 保持通用超的类型参数在运行时。

但是你不能使用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



文章来源: Unable to get a generic ResponseEntity where T is a generic class “SomeClass