spring-boot-devtools导致@RabbitListener反序列化失效
消息的发送
今天在调试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