Spring JMS 在支持 String 等的同时使用 MarshallingMessageConverter

Spring JMS using MarshallingMessageConverter while supporting String, etc

使用 XML 配置 - 我有 MarshallingMessageConverter 工作;但是,我仍然想发送一些带有简单 String 值的 TextMessage 消息。

看来我的配置迫使我从一个沟渠(无自动 JAXB 编组)进入另一个沟渠(仅 JAXB 编组):

这是我的相关 XML 配置:

<bean id="jaxbConverter" class="org.springframework.jms.support.converter.MarshallingMessageConverter">
    <property name="marshaller" ref="jaxb2Marshaller" />
    <property name="unmarshaller" ref="jaxb2Marshaller" />
</bean>

<bean id="jmsListenerContainerFactory"
      class="org.springframework.jms.config.DefaultJmsListenerContainerFactory">
    <property name="errorHandler" ref="jmsErrorHandler" />
    <property name="connectionFactory" ref="connectionFactory"/>
    <property name="destinationResolver" ref="jmsDestinationResolver"/>
    <property name="messageConverter" ref="jaxbConverter" />
</bean>

JAXB 编组工作正常,但有时我想发送一个空的 body(仅限 header 属性)消息;这会导致如下错误:

.UnmarshallingFailureException: JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException
 - with linked exception:
[org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.]

这是有道理的,因为我在 body.

中发送了一个 non-JAXB 字符串(或什么都没有)

是否可以两全其美? Stringbyte[]Map org.springframework.jms.support.converter.SimpleMessageConverter - 和 - org.springframework.jms.support.converter.MarshallingMessageConverter ?

的转换行为

通过使用另一个转换器创建第二个容器工厂并在我的 @JmsListener 注释中明确使用它来实现此目的的唯一方法是什么?

创建一个简单的 DelegatingMessageConverter(实现 MessageConverter)并将其委托给 SimpleMessageConverterMarshallingMessageConverter(甚至 MappingJackson2MessageConverter)基于一条消息 属性,例如message.getStringProperty("contentType") - text/plain, application/xml, application/json.