当前位置: 首页 > news >正文

在 Java 中使用泛型时遇到的问题,,无法正确将响应数据映射为需要的数据

public <T> List<T> getOrderList(String shopId, Class<T> tClass) {// --- 省略一些中间过程----ParameterizedTypeReference<KeRuYunCommonResultVO<KPOSPageResultVO<T>>> responseType =new ParameterizedTypeReference<KeRuYunCommonResultVO<KPOSPageResultVO<T>>>() {};ResponseEntity<KeRuYunCommonResultVO<KPOSPageResultVO<T>>> resultEntity=   restTemplate.exchange(uri,HttpMethod.POST,httpEntity, responseType);// --- 省略一些中间过程----return null;}

调用

List<KryKopsOrder> dataList= keRuYunServiceManager.getOrderList(KPOS,"XXXXXXXX",KryKopsOrder.class);

问题分析

代码中,使用了 ParameterizedTypeReference<KeRuYunCommonResultVO<KPOSPageResultVO>> 来指定泛型类型信息,但由于 Java 的类型擦除特性,这样仍然可能不足以让 Jackson(ObjectMapper 的底层库)正确地反序列化泛型参数 T。

解决方案:使用自定义的 ParameterizedTypeReference

通过以下步骤进一步明确类型信息,从而解决泛型类型映射问题:

  1. 创建一个 ParameterizedTypeReference 的子类:在实际调用时明确指定泛型类型 T。
  2. 使用 TypeFactory 提供准确的类型信息:确保 Jackson 能获取正确的类型信息。
// 使用 TypeFactory 创建泛型类型JavaType responseType = objectMapper.getTypeFactory().constructParametricType(KeRuYunCommonResultVO.class,objectMapper.getTypeFactory().constructParametricType(KPOSPageResultVO.class, tClass));ResponseEntity<KeRuYunCommonResultVO<KPOSPageResultVO<T>>> resultEntity = restTemplate.exchange(uri,HttpMethod.POST,httpEntity,ParameterizedTypeReference.forType(responseType));

解释

  1. JavaType: 通过 ObjectMapper 的 TypeFactory 来构建一个包含泛型类型信息的 JavaType
    对象。这里指定了 KeRuYunCommonResultVO 和 KPOSPageResultVO 的参数类型为 T。

  2. ParameterizedTypeReference.forType(responseType): 将构建的 JavaType 转换为
    ParameterizedTypeReference,从而明确指定泛型类型信息。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【微信小程序】导入项目
  • SEO之网站结构优化(十三-网站地图)
  • Spring Cloud Alibaba
  • 正则表达式记录
  • 斯坦福大学cs231n (图像分类)
  • 所有可能的路径
  • 【Linux C++】log4cpp日志库的安装和使用详解
  • C++初学(16)
  • Windows系统上进行项目管理工具VisualSVN Server服务端的保姆级安装教程与配置和SVN客户端保姆级安装教程和使用
  • 【项目】云备份系统笔记
  • 部署SAM2遇到的问题
  • JVM理论篇(一)
  • 项目策划书六度自由双足机器人
  • 云计算day33
  • Docker Desktop镜像路径修改一直报错
  • 【347天】每日项目总结系列085(2018.01.18)
  • Android优雅地处理按钮重复点击
  • Angular4 模板式表单用法以及验证
  • dva中组件的懒加载
  • Electron入门介绍
  • HTTP 简介
  • JAVA SE 6 GC调优笔记
  • js面向对象
  • js学习笔记
  • JS专题之继承
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Spring Boot快速入门(一):Hello Spring Boot
  • vue--为什么data属性必须是一个函数
  • 检测对象或数组
  • 入门到放弃node系列之Hello Word篇
  • 双管齐下,VMware的容器新战略
  • 推荐一个React的管理后台框架
  • 一道闭包题引发的思考
  • FaaS 的简单实践
  • # C++之functional库用法整理
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #职场发展#其他
  • (1) caustics\
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (排序详解之 堆排序)
  • (十一)c52学习之旅-动态数码管
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一) storm的集群安装与配置
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (原創) 物件導向與老子思想 (OO)
  • ****Linux下Mysql的安装和配置
  • .cfg\.dat\.mak(持续补充)
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET Core中的去虚
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)