如何使用 Mule 流在 Mule ESB 中设计 SOAP/WSDL Web 服务?

How to design a SOAP/WSDL web service in Mule ESB using Mule flow?

我们使用的是 7.1 EE,我的任务是在 Mule 上设计一个 SOAP/WSDL Web 服务 运行,供外部客户端使用。 WSDL 作为输入给出。

MuleSoft推荐的方法是使用CXF组件,用wsdl2java生成java类,然后在java代码中加入WS逻辑. 这当然有效,但它更像是一种 java 完成任务的方式,而不是 Mule ESB 方式。

我更喜欢 Mule 流和消息转换组件实现 WS 逻辑的方法,而不是 java 类

实际上,APIKit 已经在以这种方式工作。不幸的是,它不支持 WSDL。 所以,我正在寻找的是以下内容:

  1. 将 WS 输入作为负载中的 POJO(在 CXF 验证模式之后)。
  2. 使用 DataMapper 将 POJO 转换为一些外部 VM 输入参数
  3. 从 VM 获取响应到 DataMapper,将值放入 WS Response POJO。
  4. 让 CXF 完成return响应调用者的任务。

恕我直言,这将是更多 Mule 完成任务的方式。

现在,查看生成的 java 代码,那里已经存在请求和响应 POJO,可以在 DataMapper 中使用。

我怀疑实际上可能有一种方法可以在 Mule 负载中获取 WS 请求 POJO,对其进行转换,填充结果 POJO 并以某种方式return 将其返回到 CXF。

关于如何实施的任何想法?

请注意,我认为使用 CXF 代理模式不是一个好的选择。因为使用这种方法,您实际上失去了有关 request/response 格式的知识。然后您必须手动定义映射的有效负载字段...实际上,这将是手动 SOAP 解析。

您是否尝试过 xml-to-jabx 对象转换来生成您的 pojo?我假设您有自己的 xml 架构 (xsd)。您可以在数据映射器中使用生成的 pojo。

您可以在 CXF 消费者中指定由 CXF 提供者生成的 wsdl 的位置,这样您就可以从 WSDL 或使用 wsdl2java 工具生成 WS 服务 class。

这是一个示例 WS 提供程序:

<flow name="service-flow">
    <http:listener config-ref="HTTP_Listener_Configuration" path="/service" doc:name="HTTP" allowedMethods="POST"/>
    <cxf:jaxws-service doc:name="CXF" serviceClass="service.Service"/>
    <component doc:name="Java" class="service.ServiceImpl"/>
</flow>

那么这里是WS消费者:

<flow name="serviceconsumerFlow" processingStrategy="non-blocking">
    <outbound-endpoint
        address="http://${service.host}:${service.port}/service"
        doc:name="WS Consumer Service" exchange-pattern="request-response"
        mimeType="text/xml">
        <cxf:jaxws-client operation="executeOperation"
            clientClass="package.ServiceService"
            port="ServicePort" wsdlLocation="classpath:/service.wsdl"
            doc:name="CXF" />
    </outbound-endpoint>
    <byte-array-to-object-transformer returnClass="package.POJO" doc:name="Byte Array to Object"/>
</flow>

您会从上面注意到 CXF jaxws 客户端被包装在 .

好吧,其实这很简单。显然,CXF 已经在以这种方式工作,即将请求输入 POJO 放入有效负载中,并期望在最后输出 POJO。简单。

我被 MuleSoft 文档和示例误导了,其中所有文档和示例都在 CXF 之后紧接着 Java 组件。

这是我做过的一个小测试。 DataMapper是从Request POJOclass生成到Response POJOclass。

<flow name="ws_callFlow">
    <http:listener config-ref="httpListenerConfig" path="/myws" doc:name="HTTP" allowedMethods="POST"/>
    <cxf:jaxws-service doc:name="CXF" configuration-ref="CXF_Configuration" serviceClass="ws.myws" validationEnabled="true"/>
    <data-mapper:transform config-ref="Pojo_To_Pojo" doc:name="Pojo To Pojo">
    </data-mapper:transform>
</flow>