我有一个像这样的 JMS“端点”:
@JmsListener(destination = "TestQueue")
public void doSomething(MyJaxbAnnotatedClass myclass) {
}
当然需要像
public void doSomething(String xmlString)
但我希望由 Spring 完成自动解码,就像我在 Spring-MVC 上下文中使用 JSON 一样。但不知何故,Spring 需要更多配置才能实现这一点,因为我在尝试 MyJaxbAnnotatedClass 参数时得到以下堆栈跟踪:
Caused by: org.springframework.messaging.converter.MessageConversionException: No converter found to convert to class de.xxx.xxx.MyJaxbAnnotatedClass, message=GenericMessage [payload=<BRNArtikelStamm:EcomxProducts
xmlns:BRNfoo="http://www.xxx.xxx/foofoo"
所以我假设我必须以某种方式告诉 Spring 如何解码?由于 JAXB 是一种非常常见的序列化方式,我希望有一个需要应用的通用配置。
感谢任何输入。
最佳答案
您需要注册一个能够执行此操作的消息转换器,这与您为任何非平凡的转换所做的差不多。
由于您显然正在使用默认的 JmsListerContainerFactory
,因此扩展它为您的监听器注册一个消息转换器,例如:
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setMessageConverter(jmsMessageConverter());
return factory;
}
您的 jmsMessageConverter
定义了消息是如何反序列化的(您可以在生产端重用相同的实例)。尝试使用 MarshallingMessageConverter
和 Jaxb2Marshaller
关于java - Spring JMSListener 和 JAXB 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27405195/