我有一个JMS"端点"像这样:
@JmsListener(destination = "TestQueue")
public void doSomething(MyJaxbAnnotatedClass myclass) {
}
当然使用所需的applicationContext配置,例如< jms:annotation-driven />和喜欢。当我的方法签名只是
时,这一切都有效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是一种非常常见的序列化方式,我希望有一个需要应用的通用配置。
感谢您的任何意见。
答案 0 :(得分:4)
您需要注册能够执行此操作的消息转换器,就像您必须执行任何非平凡的转换一样。
由于您显然使用默认的JmsListerContainerFactory
,因此请将其扩展为为您的侦听器注册消息转换器,例如:
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setMessageConverter(jmsMessageConverter());
return factory;
}
您的jmsMessageConverter
定义了如何反序列化消息(您可以在生产方重用相同的实例)。使用MarshallingMessageConverter
Jaxb2Marshaller