【问题标题】:How to expose SOAP Web Service using MarshallingWebServiceInboundGateway (with Spring Integration DSL)如何使用 MarshallingWebServiceInboundGateway 公开 SOAP Web 服务(使用 Spring Integration DSL)
【发布时间】:2019-05-16 04:03:35
【问题描述】:

我正在努力寻找使用 MarshallingWebServiceInboundGatewaySpring Integration 的好例子

我整理了一个使用MarshallingWebServiceInboundGateway 公开订单服务的工作示例,并在调用它时使用MarshallingWebServiceOutboundGateway 使用订单详细信息服务

https://github.com/yortch/spring-integration-demo/blob/outboundgateway/services/order-flow/src/main/java/com/demo/integration/order/OrderEndpoint.java

    @ServiceActivator(inputChannel= ChannelNames.ORDER_INVOCATION, outputChannel = ChannelNames.ORDER_DETAIL_REQUEST_BUILDER)
    OrderRequest getOrder(OrderRequest orderRequest) {
        return orderRequest;
    }

这在某种程度上可行,但是我对以下方法的期望是这应该是 Web 服务方法的签名,即返回 OrderResponse 类型。当我通过调用其他 POJO 手动构建 OrderResponse 时,我最初是这样工作的,但是我不知道如何保留原始 Web 服务方法签名并在内部使用 Spring Integration 来实现,即通过调用通道进行转换,然后调用订单明细服务(使用MarshallingWebServiceOutboundGateway)。

如果您知道任何执行此操作的代码示例,请分享。我遇到了这个,但这是直接构建响应(不使用 Spring Integration 通道):https://bitbucket.org/tomask79/spring-boot-webservice-integration/src/master/

【问题讨论】:

  • 你的问题不清楚。您需要的一切都是MarshallingWebServiceInboundGateway @Bean 定义和@EnableIntegration。但是,根据您的描述,您似乎拥有一切。请详细说明什么不起作用以及您希望它如何起作用?
  • 我想保留 Web 服务 API 的签名,即 getOrder 方法应该返回一个 OrderResponse 而不是 OrderRequest... ``` OrderResponse getOrder(OrderRequest orderRequest) { \\return OrderResponse 通过调用 Spring Integration 通道 } ``` 但是,如果我更改方法签名,我无法弄清楚如何返回将返回 OrderResponse 实例的 Spring Integration 通道的输出
  • 这还不清楚。您只需拥有这样一个 @ServiceActivator 方法并自己创建 OrderResponse 以供返回。如果这是集成流程的结束,则该对象将成为回复消息的payload。然后MarshallingWebServiceInboundGateway 将负责此OrderResponse 对象的正确编组。
  • 正确,我可以直接构建OrderResponse,但是我也有一个@Transformer(github.com/yortch/spring-integration-demo/blob/…),它构建了一个OrderDetailRequest,而OrderDetailRequest又用于使用@987654343调用另一个Web服务@。我希望能够通过调用我的 @Transformer\MarshallingWebServiceOutbountGateway 路由来构建 OrderResponse 对象。有没有办法以编程方式调用@Transformer?

标签: spring-integration spring-integration-dsl


【解决方案1】:

听起来有些误解什么是 Spring Integration 流程以及它的端点是如何工作的。

  1. Spring 集成中的三个一等公民:MessageChannelEndpoint
  2. 端点通过通道连接
  3. 端点使用来自其输入通道的消息
  4. 端点可能会在计算到输出通道时产生消息。

因此,在您的情况下,您希望公开一个 SOAP 服务,该服务将在内部调用另一个 SOAP 服务。

您已正确使用MarshallingWebServiceInboundGateway 开始。我猜这个,在它的通道中产生了一个OrderRequest 对象。它期望在其replyChannel 中包含OrderResponse(在标头中显式或临时)。我不确定你的getOrder() 做了什么,但如果还有变压器和MarshallingWebServiceOutboundGateway,你需要考虑将它们全部连接到流中。因此,我认为您的服务结果应该进入作为变压器输入的通道。这个变压器的输出应该去MarshallingWebServiceOutboundGateway。这个网关的结果可能会去其他一些转换器构建一个OrderResponse,它可能只是进入MarshallingWebServiceInboundGateway的回复通道。

如果这不是您所期望的解释,那么我会要求您重新表述您的问题...

【讨论】:

  • 这实际上是我已经有的,但我希望完成的是将@ServiceInvocation方法和回复通道方法合并为一个“发送和接收”方法,以便清楚getOrder 方法接受 OrderRequest 并返回 OrderResponse。听起来这要么是不可行的,要么不是使用 Spring Integration 的“正确”方式?
  • 这可以通过@ServiceActivator 方法的@MessagingGateway 调用来完成:docs.spring.io/spring-integration/docs/current/reference/html/…。虽然对我来说,做这种细粒度的做法听起来并不合理,因为我们可以通过直接通道和端点组合来做一个正常的流程。
  • 这就是我所怀疑的,听起来我已经有了更好的方法。不幸的是,这使我们的代码流更难遵循。感谢 Artem 的投入和抽出宝贵时间!
猜你喜欢
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 2022-07-11
相关资源
最近更新 更多