当前位置: 首页 > 面试题库 >

无法获得通用ResponseEntity

董康平
2023-03-14
问题内容

请帮助我得到一个ResponseEntity<T>where 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);

问题答案:

通过引入修复了该问题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:如果你的对象定义了urland template成员,则只需使用其简单名称即可访问它们,而不必像你这样做时那样通过前缀this.urlthis.template



 类似资料:
  • 我有几个运行在不同节点上并执行Spring批处理作业的“Orchestrator”微服务实例。一次只有一个实例必须是“活动的”并执行该作业。每天通过带有cron表达式的注释调度作业两次。因此,mocriservice尝试使用一个标识的作业来执行,该作业是一个被截断为秒,以补偿我的实例所运行的OpenShift节点之间的时间差。底层DB是Postgres12,事务隔离级别设置为可重复读取。 这个问题

  • 我试图创建一个程序,在这个程序中我可以接受输入,并用servlet获得一个数字的平方根。我是初学者,所以知道的不多。问题是当我尝试我的代码时,它不起作用。代码如下: myservletdemo.java 结果是:首先,当你点击链接时,你会得到: 这个结果

  • 在尝试执行GET到发布者存储库时,我正在执行GET和无限循环。 出版商: 书: 完整代码可在此处获得: https://github.com/vanyasav/library

  • iam无法在运行应用程序时检索到swagger ui,http://localhost:8080/Swagger-ui.html,有人能说出原因吗?

  • 问题内容: 我有线程池,它将带一个工作线程。我需要获得此Callable任务,但无法获得它。 在下面的示例中,我需要为RejectionHandler执行的Callable任务的uniqueId。在中,浇铸,我希望它应该被强制转换为工作线程。 请帮助我获取中的Worker线程实例。 输出量 我期待CallableWorkerThread而不是FutureTask。帮助我获取WorkerThread

  • 我是Spring框架的新手。我尝试在@component中使用@bean注释配置2bean。之后,我尝试getBean(按名称),得到一个NoSuchBeanDefinitionException。请帮我解决一下。 这是我的代码:-组件: