Spring JMSListener 和 JAXB 编组

Mar*_*arc 4 java xml spring jaxb spring-jms

我有一个像这样的 JMS“端点”:

@JmsListener(destination = "TestQueue")
public void doSomething(MyJaxbAnnotatedClass myclass) {
}
Run Code Online (Sandbox Code Playgroud)

当然还有所需的 applicationContext 配置,例如 <jms:annotation-driven/> 等。当我的方法签名只是一个时,所有这一切都有效

public void doSomething(String xmlString)
Run Code Online (Sandbox Code Playgroud)

但我希望由 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" 
Run Code Online (Sandbox Code Playgroud)

所以我想我必须以某种方式告诉 Spring 如何解组?由于 JAXB 是一种非常常见的序列化方式,因此我希望有一个需要应用的通用配置。

感谢您的任何意见。

Ste*_*oll 6

您需要注册一个能够执行此操作的消息转换器,就像您必须为任何重要的转换所做的那样。

由于您显然使用的是 default JmsListerContainerFactory,因此请将其扩展为您的侦听器注册消息转换器,如下所示:

@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory());
    factory.setMessageConverter(jmsMessageConverter());
    return factory;
}
Run Code Online (Sandbox Code Playgroud)

jmsMessageConverter定义消息的反序列化方式(您可以在生产端重用同一实例)。尝试MarshallingMessageConverterJaxb2Marshaller