记一次处理Spring-boot使用dubbo类型转换失败的问题

news2025/1/11 0:01:20

第一步、使用父类接收子类,类型转换失败,猜测是不是父子类不能接收,(应该不可能,但还是试下);
第二步、使用同一个类接收,还是类型转换失败;
com.book.common.result.RestResponse 不能转换为com.book.common.result.RestResponse 后面加了
org.springframework.boot.devtools.restart.classloader.RestartClassLoader
第三步、查看报错信息,同一个类型转换失败,但后面加了个RestartClassLoader,没有引入自己实现过这个ClassLoader啊,一般用的是

Bootstrap ClassLoader(引导类加载器):加载JDK核心类库,路径在 JAVA_HOME/lib下面的JAR,自己新加一个JAR放在这个目录下,它也不会加载,它只加载JDK核心类库,包必须是(sun、java、javax开头的类),用C/C++调用,JAVA打印是NULL

Extension ClassLoader(扩展类加载器):开发者可以直接使用扩展类加载器,该加载器负责加载java_home/lib/ext目录下类库;开发者也可以使用扩展类加载器加载-Djava.ext.dir指定目录下的类库。

App ClassLoader(应用类加载器):应用类加载器主要用于加载系统应用的class文件。它负责加载系统类路径java -classpath或-D java.class.path 指定路径下的类库,也就是我们经常用到的classpath路径,开发者可以直接使用系统类加载器,一般情况下该类加载是程序中默认的类加载器,通过getSystemClassLoader()方法可以获取到该类加载器,Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象,而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式即把加载类的动作交由父类处理,是一种任务委派模式,我们代码里面自己写的类,一般用这个加载器。

User ClassLoader(自定义加载器):对某些特殊的类想要进行特殊的加载处理,可以使用自定义ClassLoader,自定义ClassLoader只需要继承抽象类java.lang.ClassLoader,之后重载方法 findClass(String name) 哪些类需要使用当前加载器,可以重载loadClass(String path)怎么加载类。

同一个对象,加载器不同,加载到内存中之后,也不属于一个对象,这里也涉及到了为什么使用双亲委派模式,这里暂时不展开写什么是双亲委派,可以查百度。

第四步、根据上面的代码,可以猜测,应该是使用AppClassLoader,怎么打印了一个RestartClassLoader的加载器,是不是因为ClassLoader不同造成了对象不能转换,之后断点到对象,打印对象 obj.getClass().getClassLoader(),Dubbo返回的对象却是是AppClassLoader,但直接在代码处new一个相同的对象,打印的ClassLoader却是RestartClassLoader,所以转换失败,原因已找到;

解决办法:
1、找到引入RestartClassLoader的地方,发现是spring-boot-devtools,Spring 提供的热部署工具引入的,移除热部署工具,但我用了热部署工具做初始化boot-starp.yml加载,移除之后,这个加载的配置也需要重新处理,很麻烦;
2、指定RestResponse用AppClassLoader加载;
在这里插入图片描述
源码解析:org.springframework.boot.devtools.settings.DevToolsSettings会加载配置
org.springframework.boot.devtools.restart.ChangeableUrls的构造方法会根据配置确定哪些jar和目录需要使用RestClassLoader,把指定的类排除,之后就可以了,但这个只能指定很细粒度的;
3、使用Bootstrap或Extension的ClassLoader做返回,这样也能正常返回,比如用Object接收,但对Dubbo返回的对象,使用强转,也存在加载器不同,不能强转的问题,之后就需要借助反射,反射针对的是属性和方法,不同的加载器也是可以处理的,这样就处理了一个,但每个地方都需要反射,就提炼出一个公共的类处理
在这里插入图片描述
这样也能正常使用,但对存在子对象的也需要特殊除了;

目前使用的是第三种方法,可以根据实际情况调整使用方法,问题暂时解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/582531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

将 Rust 程序编译为 WebAssembly

Rust 笔记、WebAssembly 将 Rust 程序编译为 WebAssembly 的知识与实践 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 :291148484163.com 本文地址:https://blo…

浅谈安科瑞霍尔传感器在转速测量中的选型与应用

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘 要:在现代工业生产中存在许多需要转速测量的方面,针对转速测量方法落后、只能进行接触式测量等问题,提出把霍尔传感器应用于工业生产中 , 利用霍尔效应测量转速,具有动…

【linux解压和打包文件】

TOC 打包成zip文件 指令 zip zip -r -q -o html.zip html/ -r 参数表示递归打包包含子目录的全部内容,-q 参数表示为安静模式,即不向屏幕输出信息,-o 表示输出文件,需在其后紧跟打包输出文件名。解压zip文件 1.unzip -q …

数字化时代,企业面临哪些共同的挑战?

在这种全新的社会、商业环境下,各行各业的企业都开始寻求探索新的商业模式,通过转型适应当前时代的转变,促进业务健康持续的发展。所以数字化成为了企业进行转型的工具,也成为了众多领域内企业对未来的共识。 一、管理挑战 ●经…

C++服务器框架开发3——协程与线程的简单理解/并发与并行

该专栏记录了在学习一个开发项目的过程中遇到的疑惑和问题。 其教学视频见:[C高级教程]从零开始开发服务器框架(sylar) 上一篇:C服务器框架开发2——头文件memory/typedef C服务器框架开发3——协程与线程的简单理解/并发与并行 目前进度协程与线程的简…

【基于容器的部署、扩展和管理】3.1 容器编排系统和Kubernetes集群的构建

往期回顾: 第一章:【云原生概念和技术】 第二章:【容器化应用程序设计和开发】 3.1 基于容器的部署、扩展和管理 3.1.1 容器介绍3.1.2 容器编排系统和Kubernetes集群的构建3.1.2.1 Kubernetes 集群3.1.2.2 容器编排系统 3.1.3 Kubernetes 集…

MySQL — 锁

文章目录 锁0、概述一、全局锁1.1 概述1.2 语法1.3 一致性数据备份1.4 问题 二、表级锁2.1 表锁2.2 元数据锁2.3 意向锁 三、行级锁3.1 概述3.2 行锁3.3 间隙锁 与 临建锁 锁 0、概述 锁是计算机协调多个进程和线程并发访问某一资源的机制。 ​ 在数据库中,除传统…

5.5G,通信产业下一个分水岭?

通信领域的变化日新月异,在5G商用渐次铺开之后,5.5G比6G先行到来。 5月28日获悉,近日北京移动首个5G-A实验基站在昌平区的国际信息港建设开通,引发业内关注。业内观点认为,5.5G是5G和6G之间的过渡“台阶”,…

阿秀离职了

小伙伴们大家好,我是阿秀。 是的,我从字节离职了,从抖音研发大部门离职了。 我从21年6月份毕业后就一直在字节跳动抖音这边工作,到现在差不多已经 2 年时间了,两年时光如白马过隙一晃而过,时间真的很快。 天…

Matlab与ROS(1/2)---ros1_bridge(八)

0. 简介 众所周知,ROS 2是具有不同架构的ROS的更新版本。这两个网络是分开的,在ROS和ROS 2的节点之间没有直接的通信。而ros1_bridge包则是提供了一个网桥,可以在ROS和ROS 2之间交换消息。桥接器管理所需的所有转换,并在两个网络…

【源码篇】基于SpringBoot+Vue的学生选课管理系统

1、项目介绍 基于SpringBootVue的学生选课管理系统采用前后端分离的架构方式,系统分为管理员、老师、学生等三种角色,权限分配如下 管理员拥有所有权限 学生管理:可以对所有学生进行管理操作(新增学生、修改学生、删除学生&…

【Netty】一行简单的writeAndFlush都做了哪些事(十八)

文章目录 前言一、源码分析1.1 ctx.writeAndFlush 的逻辑1.2 writeAndFlush 源码1.3 ChannelOutBoundBuff 类1.4 addMessage 方法1.5 addFlush 方法1.6 AbstractNioByteChannel 类 总结 前言 回顾Netty系列文章: Netty 概述(一)Netty 架构设…

基于Java+SpringBoot+Vue实现美术馆管理系统

博主介绍:✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

HTMLCSS中的树形结构图

我们可以只使用 html 和 css 创建树视图(可折叠列表) &#xff0c;而不需要 JavaScript。可访问性软件将看到树形视图作为列表嵌套在披露窗口小部件中&#xff0c;并且自动支持标准键盘交互。 1、HTML 我们就从简单嵌套列表的 html 开始: <ul><li>Giant planets&…

五个有用的微信公众号运营技巧!

微信公众号是一个非常有用的网络工具&#xff0c;可以让个人或组织与其关注者建立起联系。随着人们使用微信的增加&#xff0c;许多公司和组织都使用微信公众号来扩大其业务范围和提高其品牌形象。在本文中&#xff0c;我将分享一些关于如何运营一个成功的微信公众号的建议。 一…

入门性能测试(一)

一、JDK的下载和安装 1、jdk安装 官网位置&#xff1a;https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 2、安装JDK 建议&#xff1a;安装路径&#xff0c;不要有汉字目录&#xff0c;不要有空格目录&#xff0c;不要有x86目录 3、配置环境变量…

附下载 | 354个数据开发利用机构名单来了

数字中国建设正在驶入发展快车道。2023年2月&#xff0c;中共中央、国务院印发的《数字中国建设整体布局规划》提出&#xff0c;到2025年&#xff0c;基本形成横向打通、纵向贯通、协调有力的一体化推进格局&#xff0c;数字中国建设取得重要进展。到2035年&#xff0c;数字化发…

一个未初始化的局部变量引起的BUG(二)-PC13引脚异常

现象&#xff1a; STM32F030C8中PC13引脚异常&#xff0c;配置为GPIO输出&#xff0c;有时编译后出现异常&#xff0c;表现如下&#xff1a; 1、不能输出高电平。 2、烧回原来正确的版本固件&#xff0c;也不能输出高电。 3、过一段时间后&#xff0c;能恢复。 4、同样的代码&…

征文 | CSDN创作纪念日

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 征文 | CSDN创作纪念日 机缘 CSDN专业的IT社区&#xff0c;致力于为IT从业人员提供最新、最全面的技术资讯、最专业的技术交流平台。作为一个IT从业者&#xff0c;我最…

DG4Pros结合M3D,1:500地籍免像控实践详解

前言 免像控技术正在迈向成熟&#xff0c;逐渐从理论走向了实际应用。本期&#xff0c;我们详细讨论DG4 Pros相机配合北京中测智绘科技有限公司的Mirauge 3D软件在1:500地籍精度的免像控作业中的可行性及具体项目流程。 DG4 Pros倾斜摄影相机 实验背景 无人机航空摄影测量是…