You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 02:36:00