如何使用 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 -&gt; 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 主题

如何处理 Spring 集成流的事务(Java DSL)

Http出站网关在工作,但没有进行调用--使用spring集成DSL java。

如何将请求标头添加到 outboundGateway spring integration dsl

Spring集成Java DSL:指定自定义反序列化器