ipavlic
ipavlic

Reputation: 4966

Mule SOAP client wrapper as parameter instead of object array

I created a sample Mule flow by first generating client classes with CXF per http://www.mulesoft.org/documentation/display/current/Consuming+Web+Services+with+CXF guide.

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;
    }    
}

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:

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

What does that mean? How can I send a wrapper object that wraps all method parameters to the web service method?

Upvotes: 2

Views: 1984

Answers (1)

David Dossot
David Dossot

Reputation: 33413

Add:

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

inside wsdl:portType and CXF will generate the wrapper objects you're after.

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.

Upvotes: 3

Related Questions