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

JMS消息JSON转对象异常:无法解析javaTypes中的json__TypeId__

解决JMS消息转换时的Could not resolve 'json__TypeId__' in 'javaTypes'异常

这个问题我遇过好几次,本质是MappingJackson2MessageConverter找不到它需要的类型标识信息导致的,我来帮你一步步搞定:

问题根源

你配置转换器时设置了setTypeIdPropertyName("BrokerTrade.class"),这相当于告诉转换器:要从消息里找名为BrokerTrade.class的标识,才能确定要转成哪个Java类。但你发送的JSON里根本没有这个字段,Jackson的默认逻辑会 fallback 去查找json__TypeId__字段,自然也找不到,于是就抛出了这个异常。

解决方案

根据你的场景,有两种靠谱的解决方式:

方式一:修改发送端,带上类型标识(如果能控制发送代码)

如果发送消息的代码是你能调整的,那可以在发送时主动把类型标识加到消息属性里:

jmsTemplate.convertAndSend("你的队列名称", tradeObject, message -> {
    // 把BrokerTrade的全类名放到消息属性中,和接收端配置的属性名保持一致
    message.setStringProperty("BrokerTrade.class", BrokerTrade.class.getName());
    return message;
});

要是发送端也用MappingJackson2MessageConverter,那给发送端的转换器也配置同样的setTypeIdPropertyName("BrokerTrade.class"),它会自动帮你把类型信息嵌入到消息里。

方式二:接收端直接指定默认转换类型(无需修改发送端)

如果发送端没法调整,那最简单的办法就是直接告诉转换器:不管消息里有没有类型标识,都把它转换成BrokerTrade对象。修改你的转换器配置:

@Bean
public MessageConverter jacksonJmsMessageConverter() {
    MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
    converter.setTargetType(MessageType.TEXT);
    // 关键新增:指定默认转换的目标类型
    converter.setDefaultType(BrokerTrade.class);
    // 这里可以去掉原来的setTypeIdPropertyName配置了,因为我们不需要依赖类型标识了
    return converter;
}

额外注意事项

  1. 确保你的BrokerTrade实体类字段和JSON消息的字段完全匹配(包括名称大小写、字段类型),如果有名称不一致的情况,用@JsonProperty注解映射:
public class BrokerTrade {
    private Long id;
    @JsonProperty("tradeSourceId")
    private String tradeSourceId;
    // 其他字段的getter/setter必须齐全
}
  1. 实体类一定要有公开的无参构造函数,Jackson需要用它来实例化对象。

这样调整后,你的监听器应该就能正常把JSON消息转换成BrokerTrade对象了。

内容的提问来源于stack exchange,提问作者Megan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:12:14