JmsMessagingTemplate 消息转换器损坏了吗?
JmsMessagingTemplate is message converter broken?
我试图将 JmsMessagingTemplate
与具有 org.springframework.jms.support.converter.MappingJackson2MessageConverter
的 JmsTemplate
一起使用,但问题是在 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,真正的转换发生在其中。
我试图将 JmsMessagingTemplate
与具有 org.springframework.jms.support.converter.MappingJackson2MessageConverter
的 JmsTemplate
一起使用,但问题是在 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,真正的转换发生在其中。