将Mule SOAP客户端包装作为参数而不是对象数组 [英] Mule SOAP client wrapper as parameter instead of object array
问题描述
我首先按照 http://www.mulesoft.org/documentation/display/current/Consuming+Web+Services+with+CXF 指南.
通过转到localhost:8081/test
开始流程. parametersObjectArray
会将任何消息转换为Web服务方法调用所需的硬编码对象数组,如下所示:
The flow is started by going to localhost:8081/test
. The parametersObjectArray
will transform any message into a hardcoded object array required for the web service method call, like this:
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
节点时,一切都会按预期进行:
When this transformer is used in a flow to pass a message to a jaxws-client
node, everything works as expected:
<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>
我想使用包装对象,以便参数清晰易读且类型安全:
I would like to use a wrapper object, so that parameters are legible and type-safe:
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;
}
}
但是,这似乎不起作用.我注意到手册页指出:
However, that does not seem to work. I noticed that the manual page states:
注意:CXF传输不支持包装器样式的Web服务 方法调用.您可能需要创建一个绑定文件或更改WSDL 直接
Note: the CXF transport doesn't support wrapper-style web service method calls. You may need to create a binding file or change the WSDL directly
那是什么意思?如何发送将所有方法参数包装到Web服务方法的包装器对象?
What does that mean? How can I send a wrapper object that wraps all method parameters to the web service method?
推荐答案
添加:
<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
<jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
</jaxws:bindings>
内部wsdl:portType
和CXF将生成您要使用的包装对象.
inside wsdl:portType
and CXF will generate the wrapper objects you're after.
另外,请注意,创建Java转换器来设置有效负载是过大的:将set-payload
与简单的MEL表达式一起使用,您会很好的.
Also, note that creating a Java transformer to set the payload is overkill: use set-payload
with a simple MEL expression and you'll be good.
这篇关于将Mule SOAP客户端包装作为参数而不是对象数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!