JmsMessagingTemplate 消息转换器损坏了吗?

JmsMessagingTemplate is message converter broken?

我试图将 JmsMessagingTemplate 与具有 org.springframework.jms.support.converter.MappingJackson2MessageConverterJmsTemplate 一起使用,但问题是在 JmsMessagingTemplate 上导航到 org.springframework.messaging.core.AbstractMessageSendingTemplate 其中使用的转换器是 org.springframework.messaging.converter.MessageConverter 的实现,它似乎与 org.springframework.jms.support.converter.MappingJackson2MessageConverter 不兼容。

这是坏了还是我想在这里做错什么?

您还没有添加配置代码。因此,假设您没有为消息转换器添加 bean。请在下面找到配置代码片段,希望能解决问题。

@Bean
public MessageConverter jacksonJmsMessageConverter() {
    MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
    converter.setTargetType(MessageType.TEXT);
    converter.setTypeIdPropertyName("_type");
    converter.setObjectMapper(objectMapper());
    return converter;
}

@Bean
public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new JavaTimeModule());
    objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    return objectMapper;
}

@Bean
public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory,
        DefaultJmsListenerContainerFactoryConfigurer configurer) {
    JmsTemplate jmsTemplate = new JmsTemplate();
    jmsTemplate.setConnectionFactory(connectionFactory());
    jmsTemplate.setMessageConverter(jacksonJmsMessageConverter());
    return jmsTemplate;
}

@Bean
public ConnectionFactory connectionFactory() {
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
    connectionFactory.setBrokerURL(url);
    connectionFactory.setUserName(user);
    connectionFactory.setPassword(password);
    return connectionFactory;
}

因为我要包装一个 jmsMessagingTemplate,所以我必须像这样显式设置转换器:

public DelegatingJmsMessagingTemplate(JmsTemplate jmsTemplate) {
    this.jmsMessagingTemplate = new JmsMessagingTemplate(jmsTemplate);
    final var messagingMessageConverter = new MessagingMessageConverter(jmsTemplate.getMessageConverter());
    this.jmsMessagingTemplate.setJmsMessageConverter(messagingMessageConverter); //seems to do the trick
    this.jmsMessagingTemplate.setDefaultDestinationName(jmsTemplate.getDefaultDestinationName());
}

现在发布者和订阅者都相应地转换消息。

正如我在评论中提到的,我发现 org.springframework.jms.core.JmsMessagingTemplate 有一个 org.springframework.jms.core.JmsMessagingTemplate.MessagingMessageCreator,真正的转换发生在其中。