如何使用 spring 集成 dsl 解组 xml
Posted
技术标签:
【中文标题】如何使用 spring 集成 dsl 解组 xml【英文标题】:How to unmarshall xml using spring integration dsl 【发布时间】:2018-09-18 22:37:00 【问题描述】:我正在研究弹簧集成 dsl。要求是从队列中读取 xml 消息,基于消息头值,我需要调用不同的服务。我能够从队列中获取消息,但无法在 dsl 中编写代码以将 xml 消息解组为对象。有人可以帮忙吗?我有我的解组器,但无法用 dsl 连接它
IntegrationFlows
.from(Jms.inboundGateway(connectionFactory)
.destination(someQueue)
.configureListenerContainer(spec -> spec.get().setSessionTransacted(true)))
.transform(??)
【问题讨论】:
【参考方案1】:首先你可以用MarshallingMessageConverter
配置Jms.inboundGateway()
:
/**
* @param messageConverter the messageConverter.
* @return the spec.
* @see ChannelPublishingJmsMessageListener#setMessageConverter(MessageConverter)
*/
public S jmsMessageConverter(MessageConverter messageConverter)
this.target.getListener().setMessageConverter(messageConverter);
return _this();
但如果你仍然坚持使用.transform()
,那么考虑使用UnmarshallingTransformer
:
/**
* An implementation of @link Transformer that delegates to an OXM
* @link Unmarshaller. Expects the payload to be of type @link Document,
* @link String, @link File, @link Source or to have an instance of
* @link SourceFactory that can convert to a @link Source. If
* @link #alwaysUseSourceFactory is set to true, then the @link SourceFactory
* will be used to create the @link Source regardless of payload type.
* <p>
* The @link #alwaysUseSourceFactory is ignored if payload is
* @link org.springframework.ws.mime.MimeMessage.
* <p>
* The Unmarshaller may return a Message, but if the return value is not
* already a Message instance, a new Message will be created with that
* return value as its payload.
*
* @author Jonas Partner
* @author Artem Bilan
*/
public class UnmarshallingTransformer extends AbstractPayloadTransformer<Object, Object>
https://docs.spring.io/spring-integration/docs/5.0.4.RELEASE/reference/html/xml.html#xml-unmarshalling-transformer
【讨论】:
谢谢。我进行了以下更改以使其正常工作。这是正确的方式吗.from(Jms.inboundGateway(connectionFactory) .destination(sourceQueue) .jmsMessageConverter(new MarshallingMessageConverter(jaxbMarshaller())) .configureListenerContainer(spec -> spec.get().setSessionTransacted(true))) @Bean public org.springframework.oxm.Marshaller jaxbMarshaller() Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller(); .... return jaxb2Marshaller;
以上是关于如何使用 spring 集成 dsl 解组 xml的主要内容,如果未能解决你的问题,请参考以下文章
有一些方法可以为 spring 集成 dsl 流生成图表吗?
使用 Spring Integration DSL 读取 Tibco EMS 主题
Http出站网关在工作,但没有进行调用--使用spring集成DSL java。