SpringBoot整合IBM MQ收发消息时反序列化报ClassNotFoundException错误
问题解决步骤
1. 修复接收端监听方法的逻辑错误
@JmsListener注解已经完成了队列消息的拉取逻辑,会自动将消息转换后注入方法参数,无需手动调用jmsTemplate.receiveAndConvert重复消费。当前写法会导致一条消息被两次读取,第二次读取时消息已被消费,触发反序列化异常。
修改MQServiceImpl代码如下:
@Service public class MQServiceImpl{ @JmsListener(destination = "DESTINATION") public void receiveEvent(Event event) { System.out.println(event.toString()); } }
2. 配置IBM MQ自定义类反序列化信任规则
IBM MQ JMS starter默认开启反序列化安全校验,不信任自定义业务类,需要在收发两端的配置文件中添加信任包配置,将Event类所在的包加入信任列表:application.properties格式配置:
# 替换为你项目中Event类实际所在的包路径 ibm.mq.jms.trusted-packages=com.xxx.business.pojo # 测试环境可临时配置为*信任所有包,生产环境不推荐 # ibm.mq.jms.trusted-packages=*
application.yml格式配置:
ibm: mq: jms: trusted-packages: com.xxx.business.pojo
3. 可选:统一使用JSON序列化提升兼容性
JDK自带序列化方式存在版本、包路径强绑定问题,建议两端统一使用JSON格式传输消息,显式配置消息转换器:
收发两端均新增如下配置类即可:
@Configuration public class JmsConfig { @Bean public MessageConverter jacksonJmsMessageConverter() { MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); converter.setTargetType(MessageType.TEXT); converter.setTypeIdPropertyName("_type"); return converter; } }
4. 补充校验项
- 确认
Event类中引用的EventType、EventName枚举类均实现了Serializable接口,且两端的枚举定义、包路径完全一致 - 清空MQ队列中的历史脏消息后再重新启动服务测试
内容的提问来源于stack exchange,提问作者Faramarz Afzali
相关产品推荐
相关产品推荐

