Reputation: 580
I'm trying to write a simple web service using Axis2. Its behaviour is really simple: it takes a file in input and stores it. I've tried several things to do this "simple" file upload service. At the beginning i also tried to use Java2WSDL and WSDL2Java to create the WSDL file and the client hoping to pass the java.io.File datatype. Of course it didn't work.
I'm now trying to upload the file using SOAP attachments and MTOM or SwA. I've enabled them both in axis2\WEB-INF\conf\axis2.xml
Server side, the signature of my service operation it is:
public String uploadAttachment(OMElement omEle);
And this is the WSDL generated using Java2WSDL tool:
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xsd="http://services.italsystem.it" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://services.italsystem.it">
<wsdl:types>
<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://services.italsystem.it">
<xs:element name="uploadAttachment">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="omEle" nillable="true" type="xs:anyType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="uploadAttachmentResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
<wsdl:message name="uploadAttachmentRequest">
<wsdl:part name="parameters" element="xsd:uploadAttachment"/>
</wsdl:message>
<wsdl:message name="uploadAttachmentResponse">
<wsdl:part name="parameters" element="xsd:uploadAttachmentResponse"/>
</wsdl:message>
<wsdl:portType name="ImportServicePortType">
<wsdl:operation name="uploadAttachment">
<wsdl:input message="xsd:uploadAttachmentRequest" wsaw:Action="urn:uploadAttachment"/>
<wsdl:output message="xsd:uploadAttachmentResponse" wsaw:Action="urn:uploadAttachmentResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ImportServiceSoap11Binding" type="xsd:ImportServicePortType">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<wsdl:operation name="uploadAttachment">
<soap:operation soapAction="urn:uploadAttachment" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="ImportServiceSoap12Binding" type="xsd:ImportServicePortType">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<wsdl:operation name="uploadAttachment">
<soap12:operation soapAction="urn:uploadAttachment" style="document"/>
<wsdl:input>
<soap12:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap12:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="ImportServiceHttpBinding" type="xsd:ImportServicePortType">
<http:binding verb="POST"/>
<wsdl:operation name="uploadAttachment">
<http:operation location="uploadAttachment"/>
<wsdl:input>
<mime:content type="application/xml" part="parameters"/>
</wsdl:input>
<wsdl:output>
<mime:content type="application/xml" part="parameters"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ImportService">
<wsdl:port name="ImportServiceHttpSoap11Endpoint" binding="xsd:ImportServiceSoap11Binding">
<soap:address location="http://localhost:8080/axis2/services/ImportService"/>
</wsdl:port>
<wsdl:port name="ImportServiceHttpSoap12Endpoint" binding="xsd:ImportServiceSoap12Binding">
<soap12:address location="http://localhost:8080/axis2/services/ImportService"/>
</wsdl:port>
<wsdl:port name="ImportServiceHttpEndpoint" binding="xsd:ImportServiceHttpBinding">
<http:address location="http://localhost:8080/axis2/services/ImportService"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Client side, i've tried to call the service:
Options options = new Options();
options.setTo(new EndpointReference("http://localhost:8080/axis2/services/ImportModule"));
options.setProperty(Constants.Configuration.ENABLE_SWA, Constants.VALUE_TRUE);
options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
options.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
ServiceClient sender = new ServiceClient(null,null);
sender.setOptions(options);
OperationClient mepClient = sender.createClient(ServiceClient.ANON_OUT_IN_OP);
MessageContext mc = new MessageContext();
SOAPFactory factory = OMAbstractFactory.getSOAP12Factory();
SOAPEnvelope env = factory.getDefaultEnvelope();
mc.setEnvelope(env);
FileDataSource fileDataSource = new FileDataSource(new File("c:\\test.jpg"));
DataHandler dataHandler = new DataHandler(fileDataSource);
mc.addAttachment("FirstAttachment",dataHandler);
mepClient.addMessageContext(mc);
mepClient.execute(true);
But i get an Axis Fault on the execute call telling me "wrong number of arguments".
I've also tried calling the service using the client generated with WSDL2Java:
ImportServiceStub stub = new ImportServiceStub("http://localhost:8080/axis2/services/ImportModule");
UploadAttachment ua = new UploadAttachment();
FileDataSource fileDataSource = new FileDataSource(new File("c:\\test.jpg"));
DataHandler dataHandler = new DataHandler(fileDataSource);
ua.setOmEle(dataHandler);
UploadAttachmentResponse res = stub.uploadAttachment(ua);
But i get another Axis Fault: "org.apache.axiom.om.impl.llom.OMTextImpl cannot be cast to org.apache.axiom.om.OMElement". But i don't know what i can give as a parameter to the generated method "setOmEle" since it is an Object type..
i thought to upload a file was one of the simples services that someone can imagine.. :P i really hope someone can give me some advice, this problem is making me crazy!
thanks in advance :)
Upvotes: 2
Views: 6552
Reputation: 1
I could do this successfully when I generate stubs using wsdltojava but when I tried same using wsimport command I am receiving null parameter data at server side.
I am following below process.
@BindingType(value = SOAPBinding.SOAP11HTTP_MTOM_BINDING)
Test code with with mtom enable
//Enable MTOM
SOAPBinding binding = (SOAPBinding) bp.getBinding();
binding.setMTOMEnabled(true);
Result:- Passing i/p with Sting & byte but i/p received @ service method is null
Upvotes: 0
Reputation: 580
Andreas' advice was really helpful! I've tried passing an array of byte to the service, but i has some problems like the size of files on the server weren't of the same size of the files on the client..
With DataHandler i haven't such problems. I've enabled MTOM in Axis (\WEB-INF\conf\axis2.xml). My service operation signature was something like that:
public String importFile(String name, DataHandler dh);
And client side, after i've generated the client with WSDL2Java, i used the service as follows:
ImportServiceStub stub = new ImportServiceStub("http://localhost:8080/axis2/services/ImportModule");
ImportFile importFile = new ImportFile(); //operation name
DataSource fds = new FileDataSource(new File("FileName"));
importFile.setName("FileName");
importFile.setDh(new DataHandler(fds));
stub.importFile(importFile);
Thanks again for your support and your advices :)
Upvotes: 1
Reputation: 9154
It is actually simple: enable MTOM (but not SwA) and use DataHandler
as the argument type.
Upvotes: 2
Reputation: 373
Take a look here, but also would ask to think about using Servlet's doPost; as the thread suggests - Axis2 File Upload by chunk
If you have not seen this, then check this one too for details about the method you are using http://axis.apache.org/axis2/java/core/docs/mtom-guide.html
Upvotes: 1