如何在MappingJackson2MessageConverter中设置typeIdPropertyName

Mr.*_*eng 8 java activemq-classic spring-jms

有了Spring4 + ActiveMQ,我想从队列接收JMS消息,并自动转换为POJO.所以我添加MappingJackson2MessageConverter到DefaultJmsListenerContainerFactory

@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();

    // some other config

    MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
    converter.setTargetType(MessageType.TEXT);
    converter.setTypeIdPropertyName("???");
    factory.setMessageConverter(converter);

    return factory;
}
Run Code Online (Sandbox Code Playgroud)

这是我的Listener配置

@JmsListener(destination = "queue.fas.flight.order", containerFactory = "jmsListenerContainerFactory")
public void processOrder(OrderRegisterDto registerParam) {
    System.out.println(registerParam.toString());
}
Run Code Online (Sandbox Code Playgroud)

问题是,我不知道如何设置TypeIdPropertyName.队列不在我的控制之下,其他人发送JSON给它.

我想要一个普通的转换器.所以我使用String接收消息,并手动将其转换为POJO.
Spring4 + ActiveMQ
还有更好的方法吗?

Gar*_*ell 8

转换器期望发送方在消息属性中提供转换的类型信息.

String typeId = message.getStringProperty(this.typeIdPropertyName);
Run Code Online (Sandbox Code Playgroud)

typeId可以是类名,也可以是typeId映射图中条目的键.

如果您的消息不包含任何类型信息,则需要子类化转换器并覆盖getJavaTypeForMessage()以返回JavaType目标类的Jackson ,例如:

return TypeFactory.defaultInstance().constructType(Foo.class);
Run Code Online (Sandbox Code Playgroud)

如果它是常量而不依赖于消息中的某些信息,则可以在子类中创建静态字段.

  • 是否可以不从消息本身而是从@JmsListener 注释方法的目标类型来确定类型?例如,与控制器中发生的标准反序列化相比,这实际上是预期的行为。 (2认同)
  • 我们最近向 [Spring AMQP](http://docs.spring.io/spring-amqp/docs/1.6.0.RELEASE/reference/html/_introduction.html#_json_messageconverter) 添加了逻辑来做到这一点(从`@RabbitListener`) 方法,但它不适用于 `@JmsListener`;您需要手动配置转换器。 (2认同)