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 字符串(或什么都没有)
是否可以两全其美? String
、byte[]
、Map
org.springframework.jms.support.converter.SimpleMessageConverter
- 和 - org.springframework.jms.support.converter.MarshallingMessageConverter
?
的转换行为
通过使用另一个转换器创建第二个容器工厂并在我的 @JmsListener
注释中明确使用它来实现此目的的唯一方法是什么?
创建一个简单的 DelegatingMessageConverter
(实现 MessageConverter
)并将其委托给 SimpleMessageConverter
、MarshallingMessageConverter
(甚至 MappingJackson2MessageConverter
)基于一条消息 属性,例如message.getStringProperty("contentType")
- text/plain
, application/xml
, application/json
.
使用 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 字符串(或什么都没有)是否可以两全其美? String
、byte[]
、Map
org.springframework.jms.support.converter.SimpleMessageConverter
- 和 - org.springframework.jms.support.converter.MarshallingMessageConverter
?
通过使用另一个转换器创建第二个容器工厂并在我的 @JmsListener
注释中明确使用它来实现此目的的唯一方法是什么?
创建一个简单的 DelegatingMessageConverter
(实现 MessageConverter
)并将其委托给 SimpleMessageConverter
、MarshallingMessageConverter
(甚至 MappingJackson2MessageConverter
)基于一条消息 属性,例如message.getStringProperty("contentType")
- text/plain
, application/xml
, application/json
.