如何使用 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。
所以,我正在寻找的是以下内容:
- 将 WS 输入作为负载中的 POJO(在 CXF 验证模式之后)。
- 使用 DataMapper 将 POJO 转换为一些外部 VM 输入参数
- 从 VM 获取响应到 DataMapper,将值放入 WS Response POJO。
- 让 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>
我们使用的是 7.1 EE,我的任务是在 Mule 上设计一个 SOAP/WSDL Web 服务 运行,供外部客户端使用。 WSDL 作为输入给出。
MuleSoft推荐的方法是使用CXF组件,用wsdl2java生成java类,然后在java代码中加入WS逻辑. 这当然有效,但它更像是一种 java 完成任务的方式,而不是 Mule ESB 方式。
我更喜欢 Mule 流和消息转换组件实现 WS 逻辑的方法,而不是 java 类。
实际上,APIKit 已经在以这种方式工作。不幸的是,它不支持 WSDL。 所以,我正在寻找的是以下内容:
- 将 WS 输入作为负载中的 POJO(在 CXF 验证模式之后)。
- 使用 DataMapper 将 POJO 转换为一些外部 VM 输入参数
- 从 VM 获取响应到 DataMapper,将值放入 WS Response POJO。
- 让 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>