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 模块类加载器,

1

 

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

2

所以我就在共用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);
    }
}

 

posted @ 2026-01-08 12:43  ☆♂安♀★  阅读(1)  评论(0)    收藏  举报