Looking for some guidance on Axis1 version 1.4 help building a WS Client
that can interact with a MTOM WebService.
 
I am building the client using the Service and Call objects
The input to the service is a String and a Base64 encoded element -
looks like this
 
<arg0>
    <name>TEST</name>
    <binaryData>base64 stuff here</binaryData>
</arg0>
 
 
I have successfully called the service with null binaryData but I get
the following error when I pass actual data.
The output is the String sent back in a SOAP Fault
 
<soap:Text xml:lang ="en">Unmarshalling Error : null </soap:Text>
 
 
In this example I have a class HelloWorldMtom (JavaBean) with a String
and a DataHandler attributes that I use as input. 

        HelloWorldMtom hwMtom = new HelloWorldMtom();
        hwMtom.setName(name);
        hwMtom.setBinaryData(dh);

 
Here is the client code:

        Service service = new Service();
        Call call = (Call) service.createCall();
        call.setTargetEndpointAddress(ADDRESS);
        call.setOperationName(new QName(HELLO_NAMESPACE, "sayHello"));
        call.setSOAPVersion(SOAPConstants.SOAP12_CONSTANTS);
        call.setProperty(Call.ATTACHMENT_ENCAPSULATION_FORMAT,
Call.ATTACHMENT_ENCAPSULATION_FORMAT_MTOM);
        call.setProperty(Call.SEND_TYPE_ATTR, Boolean.FALSE);
        call.setReturnType(org.apache.axis.Constants.XSD_STRING);
        call.setOperationStyle(Style.WRAPPED);
        call.setOperationUse(Use.LITERAL);
        QName qnameHelloMtom = new QName(HELLO_NAMESPACE, "helloMtom");
        call.registerTypeMapping(hwMtom.getClass(), qnameHelloMtom, new
HelloWorldMtomSerializerFactory(), new
BeanDeserializerFactory(hwMtom.getClass(), qnameHelloMtom));
        call.addParameter("arg0", qnameHelloMtom, ParameterMode.IN);
        String ret = (String) call.invoke( new Object[] { hwMtom } );

I built a custom Serializer as follows:
 
public class HelloWorldMtomSerializer implements Serializer {

        public void serialize(QName name, Attributes attributes, Object
value, SerializationContext context) throws IOException {

                if (value!=null){

                        HelloWorldMtom data = (HelloWorldMtom)value; 
                        context.startElement(new QName("arg0"), null);
                        context.serialize(new QName("name"), null,
data.getName(), null, Boolean.TRUE, Boolean.FALSE);
                        if (data.getBinaryData()!=null){
                        Serializer jafs = new
JAFDataHandlerSerializer();
                        jafs.serialize(new QName("binaryData"), null,
data.getBinaryData(), context);

                }
                else {

                        context.serialize(new QName("binaryData"), null,
null, null, Boolean.TRUE, Boolean.FALSE);

                }
                context.endElement();
                }
                }

        public String getMechanismType() { return Constants.AXIS_SAX; }
        public Element writeSchema(Class javaType, Types types) throws
Exception {

                return null;

        }

}
Am I on the right track? 
Thanks for any help with this.
 
Note: 
A CXF and an Axis2 WS client have already been successfully built
against this WS (I am testing interop with different Java SOAP stacks)
 
Mike Barlotta
Associate
Booz | Allen | Hamilton
 

Reply via email to