java - Spring JMSListener 和 JAXB 编码

标签 java xml spring jaxb spring-jms

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

@JmsListener(destination = "TestQueue")
public void doSomething(MyJaxbAnnotatedClass myclass) {
}

当然需要像 之类的 applicationContext 配置。当我的方法签名只是一个

时,所有这些都有效
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 定义了消息是如何反序列化的(您可以在生产端重用相同的实例)。尝试使用 MarshallingMessageConverterJaxb2Marshaller

关于java - Spring JMSListener 和 JAXB 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27405195/

相关文章:

java - 将字符串更改为 Char 数组

java - 处理命令行参数

java - 为什么 Tomcat 8 不在容器中启动?

android - 颜色 xml : "Attribute is missing the Android namespace prefix"

spring - 避免在 Tomcat 的 JNDI 数据源中使用明文密码

apache - 我的应用程序中来自其他网站的奇怪请求/DefaultSavedRequest?

java - 是否可以使用 Optional.ofNullable 来检查是否为 null 并分配默认值

javascript - 如何将外部 javascript 库添加到 ionic 3 typescript 项目

java - 多节点环境中的计划作业

python - 使用 Python 将 XML 转换为 JSON?