You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动