I've written a web service with Axis2 1.6.2 with a request that extends
another type, with a request element that looks like this in its .xsd:
<xsd:element name="requestName">
<xsd:complexType>
<xsd:complexContent>
<xsd:extension base="requestBaseType">
<xsd:sequence>
<xsd:element name="param1" type="xsd:int" minOccurs="1"
maxOccurs="1" />
<xsd:element name="param2" type="xsd:string"
minOccurs="1" maxOccurs="1" />
<xsd:element name="param3" type="xsd:int" minOccurs="0"
maxOccurs="1" />
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="requestBaseType">
<xsd:sequence>
<xsd:element name="baseTypeParam1" type="xsd:string" minOccurs="0"
maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
Sending requests to this web service works just fine if I send the requests
from SoapUI or similar, but if I send the same request via GET from a
browser I get this error:
<faultstring>org.apache.axis2.databinding.ADBException: Unexpected
subelement {http://campusm.gw.com/campusm}requestName</faultstring>
It's saying there's an unexpected element of a type that is the correct
request type, even though in a GET request that request object is implicit.
If I stop it extending requestBaseType, it works fine in both the browser
and SoapUI. Here's the xsd definition that fixes the problem:
<xsd:element name="requestName">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="baseTypeParam1" type="xsd:string"
minOccurs="0" maxOccurs="1" />
<xsd:element name="param1" type="xsd:int" minOccurs="1"
maxOccurs="1" />
<xsd:element name="param2" type="xsd:string" minOccurs="1"
maxOccurs="1" />
<xsd:element name="param3" type="xsd:int" minOccurs="0"
maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
Here's an example of the GET request I send in the browser that gets this
error:
http://localhost:8080/path/to/webservice?baseTypeParam1=stuff¶m1=12¶m2=thing¶m3=13
Here's an example of the request I send from SoapUI that works:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cam="http://campusm.gw.com/campusm">
<soapenv:Header/>
<soapenv:Body>
<cam:requestName>
<cam:baseTypeParam1>stuff</cam:baseTypeParam1>
<cam:param1>12</cam:param1>
<cam:param2>thing</cam:param2>
<cam:param3>13</cam:param3>
</cam:requestName>
</soapenv:Body>
</soapenv:Envelope>
I need the request to extend a type so that I can have multiple web
services sending a large common subset of their request parameters to the
same function in my Java code. This would allow the function to take a
parameter of the base request type, and have each web service just pass its
request into that function without any conversion or worring about the
individual parameters at that point.
I also need to be able to call the web services with CURL, which is not
possible if the web services won't work with a GET request.
This seems to be a bug with Axis2. Is this a known issue and will it be
fixed?
Best regards,
Mike
--
campusM: http://www.campusM.com
Email: [email protected]
Tel: 01902 837451