Mule SOAP客户端包装器作为参数而不是对象数组

时间:2013-10-07 13:29:56

标签: soap cxf mule

我通过首先使用每个http://www.mulesoft.org/documentation/display/current/Consuming+Web+Services+with+CXF指南的CXF生成客户端类来创建示例Mule流。

转到localhost:8081/test开始流程。 parametersObjectArray会将任何消息转换为Web服务方法调用所需的硬编码对象数组,如下所示:

package com.test.example.transformers;

import org.mule.api.transformer.TransformerException;
import org.mule.transformer.AbstractTransformer;

public class GetCustomersArrayTransformer extends AbstractTransformer {

    @Override
    protected Object doTransform(Object src, String enc)
            throws TransformerException {
        Object[] msg = new Object[3];
        msg[0] = 10;
        msg[1] = 0;
        msg[2] = null;

        return msg;
    }    
}

在流中使用此转换器将消息传递到jaxws-client节点时,一切都按预期工作:

<custom-transformer name="parametersObjectArray" class="com.test.example.transformers.GetCustomersArrayTransformer" doc:name="Java"/>   


<flow name="mulecartFlow" doc:name="mulecartFlow">
    <http:inbound-endpoint exchange-pattern="one-way" host="localhost" port="8081" doc:name="HTTP" path="test"/>
    <transformer ref="parametersObjectArray" doc:name="Java"></transformer>
    <https:outbound-endpoint exchange-pattern="request-response" host="12.34.56.78" port="1234" path="services/SOAP/TestEndpoint" doc:name="HTTP" connector-ref="httpsConnector" method="POST">
        <cxf:jaxws-client clientClass="com.test.TestEndpointService" enableMuleSoapHeaders="true" doc:name="SOAP" operation="getCustomers" port="TestEndpoint" />
    </https:outbound-endpoint>
    <transformer ref="customerInfoTypesToString" doc:name="Transformer Reference"/>
    <logger level="INFO" doc:name="Logger" message="#[message:payload]"/>
</flow>

我想使用包装器对象,以便参数清晰且类型安全:

package com.test.example.transformers;

import org.mule.api.transformer.TransformerException;
import org.mule.transformer.AbstractTransformer;

import com.test.GetCustomers;

public class GetCustomersObjectTransformer extends AbstractTransformer {

    @Override
    protected Object doTransform(Object src, String enc)
            throws TransformerException {           
        GetCustomers soapRequest = new GetCustomers();
        soapRequest.setStartIndex(0);
        soapRequest.setMaxBatchSize(1);

        return soapRequest;
    }

}

然而,这似乎不起作用。我注意到手册页说明:

  

注意:CXF传输不支持包装式Web服务   方法调用。您可能需要创建绑定文件或更改WSDL   直接

这是什么意思?如何将包装所有方法参数的包装器对象发送到Web服务方法?

1 个答案:

答案 0 :(得分:3)

添加:

    <jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
        <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
    </jaxws:bindings>

wsdl:portType内,CXF将生成你所追求的包装对象。

另外,请注意,创建Java转换器来设置有效负载是过​​度的:使用set-payload和简单的MEL表达式,你会很好。