dubbo客户端调用服务端,服务端能接收到,找不到类NoSuchMethodException
dubbo版本2.1.6.FINAL ,springboot 版本是2.1.1.RELEASE,也引入了spring-boot-starter-security、springboot-devtools其中DTO实现了Serializable且实现serialVersionUID,服务端和客户端都是引用同一个API,dubbo服务器已接收到客户端serializationType=hession2的RPC请求,,只传递普通string参数可以找到方法,传递DTO对象却找不到方法,是什么原因造成报错NoSuchMethodException
具体错误日志
Fialed to invoke remote method xxx to dubble_rpc:
Caused by: java.lang.SochMethodException:
JdkProxyFactory.doInvoke(JdkProxyFactory.java:37)
JdkProxyFactory.invoke()
解决思路:
1、另外一个项目也是dubbo的服务端,被调用没问题,那意味着引入的maven没有问题,大概率是哪个组件拦截或者冲突了
2、最开始以为是security的拦截了请求,所以用postman直接去调用方法,但是却可以直接通过,那就不是这个拦截器的原因。
3、然后就开始怀疑引入的maven跟现有的pom.xml某个冲突了,结果解决了一遍,还是不行,结果写了一个测试方法,传了一个String参数成功了,那就怀疑服务端在序列化和反序列化过程中被篡改了。
4、利用 豆包AI、KIMI、seekseek、文心一言 进行分析。 刚开始告诉我DTO类没有加上serialVersionUID, 结果还是不行。 还是因为序列化和反序列化的问题,结果豆包给了我2个解决办法:1、替换序列化方式、2、先查询认 API 模块类加载器,

跟deekseep的给的解决办法有点类似

所以我就在共用API的DTO 写了一个static的代码块里面写了这个。 在客户端调用的时候发现是 在 sun.misc.Launcher$AppClassLoader,这个是springboot默认的类加载器。
而服务端被调用的时候发现类加载器是 org.springframework.boot.debtools.restart.classloader.RestartClassLoader
然后然后 一下子就明白了!!!
是因为spring-boot-devtools 这个热部署影响到了, 结果我把pom.xml 的maven注释后刷新maven,重启后重新调用就真的可以了。
需要这个devtools的原因是因为这个后端项目引入的spring-boot-starter-thymeleaf,修改static的html不需要每次重启微服务。
解决方案:
1、注释掉spring-boot-devtools 这个依赖
2、把dubbo的服务端不放在当前项目下,另外新建module专门用来做dubbo并且不引入spring-boot-devtools
3、修改dubbo的类加载器
@SpringBootApplication public class ServerApplication { public static void main(String[] args) { // 强制使用系统类加载器(AppClassLoader) Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader()); SpringApplication.run(ServerApplication.class, args); } }
浙公网安备 33010602011771号