Spring Boot JMS:MappingJackson2MessageConverter找不到已存在的_type字段
问题分析与解决方案
这个问题的核心在于ActiveMQ的REST API不会自动将你设置的普通请求头或JSON体中的_type转换为JMS消息属性,而Spring的MappingJackson2MessageConverter是从**JMS消息的属性(而非消息体内容)**中查找_type字段的,所以即便你在请求头和消息体里都加了_type,Spring依然找不到对应的标识。
正确的解决步骤
1. 明确ActiveMQ REST API的属性传递规则
ActiveMQ的REST API规定:要设置JMS消息属性,需要使用前缀为X-JMS-Property-的请求头。所以你需要把_type作为JMS属性传递,而非普通请求头或消息体字段。
2. 修正cURL命令
你需要调整两个关键细节:
- 用
X-JMS-Property-_type请求头传递类型标识 - 正确设置
Content-Type: application/json,并直接传递JSON消息体(无需body=前缀)
修正后的cURL命令如下:
curl -u 'un:pw' \ -H 'Content-Type: application/json' \ -H 'X-JMS-Property-_type: com.me.SSMessage' \ -d '{"url": "https://www.google.com"}' \ "http://localhost:8161/api/message/ssg?type=queue&clientId=consumerA"
3. 确认Spring转换器配置有效性
你的MessageConverter配置本身是正确的,它会从JMS属性中读取_type字段来确定消息类型:
@Bean public MessageConverter jsonJmsMessageConverter() { MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); converter.setTargetType(MessageType.TEXT); converter.setTypeIdPropertyName("_type"); return converter; }
为什么之前的方式失效?
- 普通请求头
_type:ActiveMQ不会将非X-JMS-Property-前缀的请求头转换为JMS消息属性,所以这个字段根本不会被附加到JMS消息上。 - 消息体中的
_type:Spring的转换器逻辑是先读取JMS属性确定消息类型,再解析消息体内容,默认不会从消息体里查找_type标识(除非你自定义转换器逻辑)。
内容的提问来源于stack exchange,提问作者mikeb




