Using the suggestions from the case 2 mentioned in http://wso2.org/library/332,
I wrote an Axis2 client to call my Axis2 service that has a string array as one
of the params. But I got following error when the call executes:
org.apache.axis2.AxisFault: com.ctc.wstx.exc.WstxParsingException: Expected a
text token, got START_ELEMENT.
at [row,col {unknown-source}]: [1,401]
at
org.apache.axis2.util.Utils.getInboundFaultFromMessageContext(Utils.java:486)
at
org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:343)
at
org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:389)
at
org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:211)
at
org.apache.axis2.client.OperationClient.execute(OperationClient.java:163)
at
org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:528)
at
org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:508)
Any suggestions?
Here is the relevant snippet from my WSDL:
<types>
<s:schema elementFormDefault="qualified"
targetNamespace="http://ws.selectica.com/ecm/">
<s:element name="AssignUserToRoles">
<s:complexType>
<s:sequence>
<s:element name="SessionToken"
type="s:string"></s:element>
<s:element name="Email"
type="s:string"></s:element>
<s:element name="RoleId"
type="s:string" maxOccurs="unbounded" minOccurs="1"></s:element>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="AssignUserToRolesResponse">
<s:complexType></s:complexType>
</s:element>
</s:schema>
</types>
<wsdl:message name="AssignUserToRolesRequest">
<wsdl:part name="parameters"
element="tns:AssignUserToRoles"></wsdl:part>
</wsdl:message>
<wsdl:message name="AssignUserToRolesResponse">
<wsdl:part name="parameters"
element="tns:AssignUserToRolesResponse"></wsdl:part>
</wsdl:message>
<portType name="ECMServiceSoap">
<wsdl:operation name="AssignUserToRoles">
<wsdl:input
message="tns:AssignUserToRolesRequest"></wsdl:input>
<wsdl:output
message="tns:AssignUserToRolesResponse"></wsdl:output>
</wsdl:operation>
</portType>
<binding name="ECMServiceSoap" type="tns:ECMServiceSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document"/>
<operation name="AssignUserToRoles">
<soap:operation soapAction="" style="document"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
...
And here is the client code:
svcClient = new ServiceClient();
Options options = new Options();
options.setTo(new EndpointReference(serviceURL));
options.setAction("http://localhost:8080/services/ECMServiceSoap/AssignUserToRoles");
svcClient.setOptions(options);
OMNamespace ns = fac.createOMNamespace(serviceNamespace, "ns1");
payload = fac.createOMElement("AssignUserToRoles", ns);
OMElement value = fac.createOMElement("SessionToken", ns);
value.setText(sessionId);
payload.addChild(value);
OMElement value = fac.createOMElement("Email", ns);
value.setText(email);
payload.addChild(value);
//roles is a String[]
OMElement value = BeanUtil.getOMElement(new
QName(ns.getNamespaceURI(),"RoleId"), roles, null, false, null);
payload.addChild(value);
OMElement responseElement=(OMElement) svcClient.sendReceive(payload);