2

我创建了一个示例 Mule 流程,首先根据http://www.mulesoft.org/documentation/display/current/Consuming+Web+Services+with+CXF指南生成带有 CXF 的客户端类。

通过转到 开始流程localhost:8081/testparametersObjectArray会将任何消息转换为 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 服务方法?

4

1 回答 1

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 表达式就可以了。

于 2013-10-07T14:22:24.343 回答