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

时间:2015-09-23 03:28:54

标签: mule

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

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

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

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

  1. 在有效负载中将WS输入作为POJO获取(在CXF验证模式之后)。
  2. 使用DataMapper将POJO转换为一些外部VM输入参数
  3. 从VM获取响应到DataMapper,将值放入WS Response POJO。
  4. 让CXF完成将响应返回给调用者的任务。
  5. 这将是更多Mule方式的任务,恕我直言。

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

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

    有关如何实施这一点的任何想法?

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

2 个答案:

答案 0 :(得分:3)

好的,实际上,这很容易。显然,CXF已经以这种方式工作,即将请求输入POJO放入有效载荷并期望输出POJO结束。简单。

我被MuleSoft文档和示例误导了,所有这些文档都是在CXF之后立即拥有Java组件的。

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

<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>

答案 1 :(得分:1)

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

您可以在CXF使用者中指定CXF提供程序生成的wsdl的位置,因此您可以从WSDL或使用wsdl2java工具生成WS服务类。

以下是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客户端正在被包装。