在Mule ESB 3.3中使用cxf:proxy-client消耗wsdl服务 - 无法找到服务的定义

时间:2012-09-04 01:18:34

标签: mule

我试图在Mule ESB 3.3中使用cfx:proxy-client来使用wsdl服务,但不断收到此错误

org.apache.cxf.service.factory.ServiceConstructionException: Could not find definition for service {http://support.cxf.module.mule.org/}ProxyService.
    at org.apache.cxf.wsdl11.WSDLServiceFactory.create(WSDLServiceFactory.java:139)
    at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromWSDL(ReflectionServiceFactoryBean.java:383)
    at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:506)

以下是我的简单流程:

<flow name="spider-middleware" doc:name="spider-middleware">
    <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" path="salesforce" doc:name="HTTP"/>
    <cxf:proxy-client operation="getCustomerByID"
                      payload="body"
                      wsdlLocation="http://localhost:4546/eplus-ws-fake/services/EplusCustomer/v1?wsdl"
                      enableMuleSoapHeaders="true"
                      doc:name="SOAP"/>
</flow>

该服务被硬编码为getCustomerByID(1)返回客户。 请详细说明如何解决这个问题? 感谢。

1 个答案:

答案 0 :(得分:3)

我得到它的工作,但只提供一个完整的SOAP信封,而不仅仅是身体,即。使用payload="envelope"

此外,我删除了operationwsdlLocation属性,这些属性对proxy-client无用。我还必须添加SOAPActionContent-Type属性,否则测试网络服务我正在使用请求中的扼流圈。

这给出了(使用来自WebServiceX.net的测试服务):

<flow name="pureCxfProxyClient">
    <vm:inbound-endpoint path="test.in"
        exchange-pattern="request-response" />
    <set-property propertyName="SOAPAction"
        value="http://www.webservicex.net/getACHByZipCode" />
    <set-property propertyName="Content-Type" value="text/xml" />
    <http:outbound-endpoint address="http://www.webservicex.net/FedACH.asmx"
        exchange-pattern="request-response" >
        <cxf:proxy-client payload="envelope" />
    </http:outbound-endpoint>
</flow>

注意我使用了一个VM端点,它允许我处理XMLStreamReader返回的cxf:proxy-client

特别是,我需要做以下事情:

    final XMLStreamReader xsr = (XMLStreamReader) result.getPayload();
    xsr.nextTag();

避免org.mule.module.xml.stax.ReversibleXMLStreamReader中的疯狂NPE。

总而言之,这非常激烈......加上cxf:proxy-client在独立使用时并没有带来太多价值。你实际上可以选择:

<flow name="pureCxfProxyClient">
    <vm:inbound-endpoint path="test.in"
        exchange-pattern="request-response" />
    <set-property propertyName="SOAPAction"
        value="http://www.webservicex.net/getACHByZipCode" />
    <set-property propertyName="Content-Type" value="text/xml" />
    <http:outbound-endpoint address="http://www.webservicex.net/FedACH.asmx"
        exchange-pattern="request-response" />
</flow>

...并被XMLStreamReader部分释放。