欢迎光临散文网 会员登陆 & 注册

spring-boot-devtools导致@RabbitListener反序列化失效

2023-08-22 00:32 作者:天羽ちよこ  | 我要投稿

消息的发送

今天在调试rabbitmq的消息发送和接收,我参考官方文档中的写法,直接将对象作为消息payload发送,写法如下:

直接发送对象要求这个类实现了序列化接口,也就是说这玩意儿默认是使用java的对象序列化实现的。

消息的接收

在接收消息是直接使用@RabbitListener注解实现的,方法如下

启动消费者后,消费直接抛出异常,异常如下

异常定位

定位到异常代码所在的类和方法:PayloadMethodArgumentResolver#resolveArgument,加上断点,看到数据如下:

异常原因是,原本有值的payload被截图中蓝色这一行(144行)给赋值为null了,继而导致146行的if条件抛出异常。

这里奇怪的是,139的if条件中的 ClassUtils.isAssignable方法判断类的继承关系,理论上应该返回true,因为targetClass和payloadClass完全一致。

但是这里返回false了,也就是说targetClass和payloadClass居然不等,继续debug发现,这俩类虽然是同一个类,但是,他俩的ClassLoader不是同一个,其中一个是RestartClassLoader

通过询问搜索引擎,RestartClassLoader是 spring-boot-devtools这个依赖做的,目的是为了在开发阶段热加载,由于我的项目不需要热加载,所以解决方案也很简单了:

删除spring-boot-devtools这个依赖。

至此,问题解决。

最后附上我的java和spring版本:

java-17

spring-boot-3.1.1

spring-boot-devtools导致@RabbitListener反序列化失效的评论 (共 条)

分享到微博请遵守国家法律