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; }
额外注意事项
- 确保你的
BrokerTrade实体类字段和JSON消息的字段完全匹配(包括名称大小写、字段类型),如果有名称不一致的情况,用@JsonProperty注解映射:
public class BrokerTrade { private Long id; @JsonProperty("tradeSourceId") private String tradeSourceId; // 其他字段的getter/setter必须齐全 }
- 实体类一定要有公开的无参构造函数,Jackson需要用它来实例化对象。
这样调整后,你的监听器应该就能正常把JSON消息转换成BrokerTrade对象了。
内容的提问来源于stack exchange,提问作者Megan
相关产品推荐
相关产品推荐

