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

兰州网站建设与优化陕西安康网站建设

兰州网站建设与优化,陕西安康网站建设,seo营销的概念,特效比漂亮的网站今天遇到一个问题#xff1a;一个典型的 Java 泛型在反序列化场景下“类型擦除 无法推断具体类型”导致的隐性 Bug#xff0c;尤其是在 RPC#xff08;如 Dubbo、Feign 等#xff09;和 本地 JVM 内直连调用共存时#xff0c;这种问题会显现得非常明显。 A 服务暴露了一…今天遇到一个问题一个典型的 Java 泛型在反序列化场景下“类型擦除 无法推断具体类型”导致的隐性 Bug尤其是在 RPC如 Dubbo、Feign 等和 本地 JVM 内直连调用共存时这种问题会显现得非常明显。 A 服务暴露了一个 RPC 接口规范如下 public class WeaResultT implements Serializable {private static final long serialVersionUID 15869325700230991L;ApiModelProperty(状态码)private int code;ApiModelProperty(提示信息)private String msg;ApiModelProperty(状态)private boolean status;ApiModelProperty(数据)private T data; } 定义的 RPC 接口如下 WeaResult selectDetail(RuleTypeSettingDto ruleTypeSettingDto);API 中的返回值没有声明泛型 T 的具体类型。然后被 B 服务调用了远程调用代码 private Integer isMultiMode(AllocationRuleDto request) {return Optional.ofNullable(ruleTypeSettingService.selectDetail(RuleTypeSettingDto.builder().moduleName(AllocationComponent.CUSTOMER_SERVICE).typeId(request.getTypeId()).tenantKey(request.getTenantKey()).typeName(cs).build())).map(WeaResult::getData).map(data -(Map?,?)data).map(dataMap - dataMap.get(sceneType)).map(Object::toString).map(Integer::valueOf).orElse(0);}接受到结果只能硬着头皮强转获取对应值。 这里解释下为什么要强转 当是 RPC 场景如 JSON 序列化传输时框架通常会把 data 转换为 MapString, Object比如 JSON 默认映射到 HashMap所以我这里直接强转成 Map 类型 map(data - (Map?,?) data)这样是能够能运行的没啥问题。 但是重点来了当是A 和 B 服务合并单体时部署时在同一个 JVM 中或者说是本地部署就会直接返回原始的具体类型对象比如是 RuleTypeSettingVo此时 (Map?, ?) data 就会抛 ClassCastException —— 因为根本不是 Map所以这个就是一个巨坑这就是没有合理定义 API 接口导致的并且泛型一定一定要注明清楚。否则调用方永远只是一个盲区。 提示这里的合并指的是将服务提供者和消费者都合并成一个单体服务部署。可能是节省客户资源。 那么怎么去正确改进呢 方法一指定泛型类型让接口明确返回结构 WeaResultRuleTypeSettingVo selectDetail(RuleTypeSettingDto ruleTypeSettingDto);这样无论是远程调用还是本地调用返回值类型一致调用方可以安全地 (Map)但是不推荐用 RuleTypeSettingVo 还是大部分都是按照实体返回。所以定义 API 规范时一定要明确所有出入参以及涉及到的泛型。 另外定义了这种 WeaResult 有 code status 返回的一定要优先判断 code status。否则你一定会吃大亏code status 可以让我们在调用远程接口时减少很多不必要的麻烦 方法二在调用方显式判断类型(不推荐) 如果你不能修改接口但调用方需要容错处理可以使用 Object data ruleTypeSettingService.selectDetail(...).getData(); Map?, ? dataMap; if (data instanceof Map) {dataMap (Map?, ?) data; } else {// 使用 BeanUtils 或反射将对象转换为 MapdataMap convertBeanToMap(data); }或者 data - JSONObject.parseObject(JSON.toJSONString(data), Map.class))你可以封装一个 convertBeanToMap(Object obj) 工具类比如用 Apache Commons BeanUtils、Spring 的 BeanWrapperImpl 或自定义反射实现。 但是这种方法不推荐这样做对调用方太不友好而且写这样的代码很不好维护。这只是一个临时解决方案 建议为 RPC 接口统一泛型类型 应该避免接口返回 WeaResult 没有明确泛型否则不同的调用方远程 vs 本地会得到结构不一致的对象严重时导致生产级兼容问题。 建议的统一写法 WeaResultMapString, Object selectDetail(RuleTypeSettingDto ruleTypeSettingDto);或者如果你能保证返回值是某个固定 VO 类 WeaResultRuleTypeSettingVo selectDetail(RuleTypeSettingDto ruleTypeSettingDto);然后在调用方处理 RuleTypeSettingVo vo result.getData(); vo.getSceneType(); // 等价于 map.get(sceneType)最后推荐大家 RPC 接口的返回值类型一旦模糊如未指定泛型不管是微服务架构体系还是合并单体公用同一个 JVM使用时都可能导致结果不一致最稳妥做法是*统一泛型类型(推荐)或封装类型转换逻辑(不推荐)。 推荐阅读文章 由 Spring 静态注入引发的一个线上T0级别事故真的以后得避坑 如何理解 HTTP 是无状态的以及它与 Cookie 和 Session 之间的联系 HTTP、HTTPS、Cookie 和 Session 之间的关系 什么是 Cookie简单介绍与使用方法 什么是 Session如何应用 使用 Spring 框架构建 MVC 应用程序初学者教程 有缺陷的 Java 代码Java 开发人员最常犯的 10 大错误 如何理解应用 Java 多线程与并发编程 把握Java泛型的艺术协变、逆变与不可变性一网打尽 Java Spring 中常用的 PostConstruct 注解使用总结 如何理解线程安全这个概念 理解 Java 桥接方法 Spring 整合嵌入式 Tomcat 容器 Tomcat 如何加载 SpringMVC 组件 “在什么情况下类需要实现 Serializable什么情况下又不需要一” “避免序列化灾难掌握实现 Serializable 的真相二” 如何自定义一个自己的 Spring Boot Starter 组件从入门到实践 解密 Redis如何通过 IO 多路复用征服高并发挑战 线程 vs 虚拟线程深入理解及区别 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别 10大程序员提升代码优雅度的必杀技瞬间让你成为团队宠儿 “打破重复代码的魔咒使用 Function 接口在 Java 8 中实现优雅重构” Java 中消除 If-else 技巧总结 线程池的核心参数配置(仅供参考) 【人工智能】聊聊Transformer深度学习的一股清流(13) Java 枚举的几个常用技巧你可以试着用用 由 Spring 静态注入引发的一个线上T0级别事故真的以后得避坑 如何理解 HTTP 是无状态的以及它与 Cookie 和 Session 之间的联系 HTTP、HTTPS、Cookie 和 Session 之间的关系 使用 Spring 框架构建 MVC 应用程序初学者教程 有缺陷的 Java 代码Java 开发人员最常犯的 10 大错误 Java Spring 中常用的 PostConstruct 注解使用总结 线程 vs 虚拟线程深入理解及区别 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别 10大程序员提升代码优雅度的必杀技瞬间让你成为团队宠儿 探索 Lombok 的 Builder 和 SuperBuilder避坑指南一 为什么用了 Builder 反而报错深入理解 Lombok 的“暗坑”与解决方案二
http://www.tj-hxxt.cn/news/228848.html

相关文章:

  • 上海法律网站建设宝塔做的网站能不能访问
  • 新乡个人网站建设东莞学平面设计
  • 大连网站设计九即问仟亿科技捡个校花做老婆是哪个网站的
  • 电商网站的二级怎么做丹阳网站建设要多少钱
  • 合肥网站建设与设计鞍山58同城招聘网最新招聘
  • wordpress 导入网站模板郑州百度网站优化
  • 临沂网站建设周口2023网络营销成功案例
  • 网站建设7个基本流程图灯罩技术支持东莞网站建设
  • 阿里云备案网站是空的建网站需要什么资质
  • 图书馆网站建设的建议做婚纱网站的意义
  • 可信网站认证 代理商网站建设课程下载
  • 腾讯网站建设专家网站目录结构怎么做
  • 网站模块报价特价网站建设价格低
  • wordpress 网站静态怎样做好网站
  • 网站制作的评价标准eclipse 网站开发教程
  • 百度广州给做网站公司南宁seo服务公司
  • 网站过期就可以抢注怎么用vs做网站
  • 武邑网站建设公司html代码软件
  • 河北网站建设口碑好wordpress自动标签页
  • 深圳高端建设网站app推广代理
  • 成都隆昌网站建设做互联网产品和运营必备的网站
  • 会员视频网站建设张家港做网站收费标准
  • 可以免费做网站推广的平台机械公司简介模板
  • 电商设计网站模板全国工程信息网
  • 网站建设查询php企业网站后台管理系统
  • 电视剧百度风云榜seo自动推广工具
  • 网站建设过程中应该注意的事项有株洲市民健康提醒
  • 长治县网站建设delphi做网站开发
  • 湛江网站建设模板定位工厂网站建设详细的步骤有哪些
  • 部队网站建设报告网站的平面设计图用ps做