Thank you guys for your answers.
The web service and the client are both java coded, so there is no
problem with the ArrayList type. My problem is that clients need to
pass/receive ArrayList<MyClass> objects to/from the web service...
For developing the Web Service and the Client I used Netbeans 6.7. The
WS is an Axis2 Web Service, created using the Netbeans "create Axis2
Service from Java..."
I hope you can help me handling complex parameters with Axis2 web
services...
Here is the entire code I used:
- Web Service
//WSList.java
package wslist;
import java.util.ArrayList;
import java.util.List;
public class WSList {
public List<MyClass> get()
{
List<MyClass> list = new ArrayList<MyClass>();
list.add(new MyClass(1, "descr1"));
list.add(new MyClass(2, "descr2"));
return list;
}
}
//MyClass.java
package wslist;
public class MyClass {
public int id;
public String descr;
}
- Client
//WSList_Client.java
package wslist_client;
public class WSList_Client {
public static void main(String[] args) {
try { // Call Web Service Operation
wslist.WSList service = new wslist.WSList();
wslist.WSListPortType port =
service.getWSListSOAP12PortHttp();
// TODO process result here
wslist.xsd.GetResponse result = port.get();
System.out.println("Result = "+result);
} catch (Exception ex) {
// TODO handle custom exceptions here
}
}
}
//ObjectFactory.java
package wslist.xsd;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlElementDecl;
import javax.xml.bind.annotation.XmlRegistry;
import javax.xml.namespace.QName;
@XmlRegistry
public class ObjectFactory {
private final static QName _HelloResponseReturn_QNAME = new QName
("
http://wslist/xsd", "return");
private final static QName _HelloName_QNAME = new QName("http://
wslist/xsd", "name");
public ObjectFactory() {
}
public HelloResponse createHelloResponse() {
return new HelloResponse();
}
public Hello createHello() {
return new Hello();
}
public GetResponse createGetResponse() {
return new GetResponse();
}
@XmlElementDecl(namespace = "
http://wslist/xsd", name = "return",
scope = HelloResponse.class)
public JAXBElement<String> createHelloResponseReturn(String value)
{
return new JAXBElement<String>(_HelloResponseReturn_QNAME,
String.class, HelloResponse.class, value);
}
@XmlElementDecl(namespace = "
http://wslist/xsd", name = "name",
scope = Hello.class)
public JAXBElement<String> createHelloName(String value) {
return new JAXBElement<String>(_HelloName_QNAME, String.class,
Hello.class, value);
}
@XmlElementDecl(namespace = "
http://wslist/xsd", name = "return",
scope = GetResponse.class)
public JAXBElement<Object> createGetResponseReturn(Object value) {
return new JAXBElement<Object>(_HelloResponseReturn_QNAME,
Object.class, GetResponse.class, value);
}
}
//GetResponse.java
package wslist.xsd;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"_return"
})
@XmlRootElement(name = "getResponse")
public class GetResponse {
@XmlElementRef(name = "return", namespace = "
http://wslist/xsd",
type = JAXBElement.class)
protected JAXBElement<Object> _return;
public JAXBElement<Object> getReturn() {
return _return;
}
public void setReturn(JAXBElement<Object> value) {
this._return = ((JAXBElement<Object> ) value);
}
}
//WSListPortType.java
package wslist;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;
import wslist.xsd.GetResponse;
import wslist.xsd.ObjectFactory;
@WebService(name = "WSListPortType", targetNamespace = "http://
wslist/")
@XmlSeeAlso({
ObjectFactory.class
})
public interface WSListPortType {
@WebMethod(action = "urn:get")
@WebResult(name = "getResponse", targetNamespace = "
http://wslist/
xsd", partName = "parameters")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public GetResponse get();
@WebMethod(action = "urn:hello")
@WebResult(targetNamespace = "
http://wslist/xsd")
@RequestWrapper(localName = "hello", targetNamespace = "http://
wslist/xsd", className = "wslist.xsd.Hello")
@ResponseWrapper(localName = "helloResponse", targetNamespace =
"
http://wslist/xsd", className = "wslist.xsd.HelloResponse")
public String hello(
@WebParam(name = "name", targetNamespace = "
http://wslist/
xsd")
String name);
}
- Here is the generated WSDL
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="
http://schemas.xmlsoap.org/wsdl/"
xmlns:axis2="
http://wslist/" 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:ns0="http://
wslist/xsd" 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://wslist/">
<wsdl:types>
<xs:schema xmlns:ns="
http://wslist/xsd"
attributeFormDefault="qualified" elementFormDefault="qualified"
targetNamespace="
http://wslist/xsd">
<xs:element name="getResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="return"
nillable="true" type="xs:anyType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
<wsdl:message name="getRequest"/>
<wsdl:message name="getResponse">
<wsdl
art name="parameters" element="ns0:getResponse"/>
</wsdl:message>
<wsdl
ortType name="WSListPortType">
<wsdl
peration name="get">
<wsdl:input message="axis2:getRequest"
wsaw:Action="urn:get"/>
<wsdl
utput message="axis2:getResponse"
wsaw:Action="urn:getResponse"/>
</wsdl
peration>
</wsdl
ortType>
<wsdl:binding name="WSListSOAP11Binding"
type="axis2:WSListPortType">
<soap:binding transport="
http://schemas.xmlsoap.org/soap/http"
style="document"/>
<wsdl
peration name="get">
<soap
peration soapAction="urn:get" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl
utput>
<soap:body use="literal"/>
</wsdl
utput>
</wsdl
peration>
</wsdl:binding>
<wsdl:binding name="WSListSOAP12Binding"
type="axis2:WSListPortType">
<soap12:binding transport="
http://schemas.xmlsoap.org/soap/
http" style="document"/>
<wsdl
peration name="get">
<soap12
peration soapAction="urn:get" style="document"/>
<wsdl:input>
<soap12:body use="literal"/>
</wsdl:input>
<wsdl
utput>
<soap12:body use="literal"/>
</wsdl
utput>
</wsdl
peration>
</wsdl:binding>
<wsdl:binding name="WSListHttpBinding"
type="axis2:WSListPortType">
<http:binding verb="POST"/>
<wsdl
peration name="get">
<http
peration location="WSList/get"/>
<wsdl:input>
<mime:content type="text/xml" part="get"/>
</wsdl:input>
<wsdl
utput>
<mime:content type="text/xml" part="get"/>
</wsdl
utput>
</wsdl
peration>
</wsdl:binding>
<wsdl:service name="WSList">
<wsdl
ort name="WSListSOAP11port_http"
binding="axis2:WSListSOAP11Binding">
<soap:address location="
http://localhost:8080/axis2/
services/WSList"/>
</wsdl
ort>
<wsdl
ort name="WSListSOAP12port_http"
binding="axis2:WSListSOAP12Binding">
<soap12:address location="
http://localhost:8080/axis2/
services/WSList"/>
</wsdl
ort>
<wsdl
ort name="WSListHttpport"
binding="axis2:WSListHttpBinding">
<http:address location="
http://localhost:8080/axis2/
services/WSList"/>
</wsdl
ort>
</wsdl:service>
</wsdl:definitions>
I hope in your help. Thank you again guys!