将Mule SOAP客户端包装作为参数而不是对象数组 [英] Mule SOAP client wrapper as parameter instead of object array

查看:87
本文介绍了将Mule SOAP客户端包装作为参数而不是对象数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我首先按照 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆