我通过首先使用每个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服务方法?
答案 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表达式,你会很好。