我们使用的是7.1 EE,我的任务是设计在Mule上运行的SOAP / WSDL Web服务,该服务可以由外部客户端使用。 WSDL作为输入给出。
MuleSoft推荐的方法是使用CXF组件,使用wsdl2java生成java类,然后将WS逻辑添加到java代码中。 这当然有效,但它更像是一种java方式来完成任务而不是Mule ESB方式。
我更喜欢一种方法,其中 Mule流和消息转换组件实现WS逻辑而不是java类。
实际上,APIKit已经以这种方式工作了。不幸的是,它不支持WSDL。 所以,我正在寻找的是:
这将是更多Mule方式的任务,恕我直言。
现在,查看生成的java代码,已经有请求和响应POJO,可以在DataMapper中使用。
我怀疑实际上有一种方法可以在Mule有效负载中获取WS请求POJO,对其进行转换,填充结果POJO并以某种方式将其返回给CXF。
有关如何实施这一点的任何想法?
请注意,我不认为使用CXF代理模式是一个不错的选择。因为使用这种方法,您实际上失去了有关请求/响应格式的知识。然后你必须手动定义映射的有效负载字段......实际上,这将是一个手动SOAP解析。
答案 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客户端正在被包装。