Spring JMSListener和JAXB编组

时间:2014-12-10 15:49:00

标签: java xml spring jaxb spring-jms

我有一个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是一种非常常见的序列化方式,我希望有一个需要应用的通用配置。

感谢您的任何意见。

1 个答案:

答案 0 :(得分:4)

您需要注册能够执行此操作的消息转换器,就像您必须执行任何非平凡的转换一样。

由于您显然使用默认的JmsListerContainerFactory,因此请将其扩展为为您的侦听器注册消息转换器,例如:

@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory());
    factory.setMessageConverter(jmsMessageConverter());
    return factory;
}

您的jmsMessageConverter定义了如何反序列化消息(您可以在生产方重用相同的实例)。使用MarshallingMessageConverter

尝试Jaxb2Marshaller