Hi there
I am encountering a problem involving Axis2 1.3 with JAXBRI databinding when
dealing with subtypes (inherited types).
I have a CoManagerIdentifier that is a subclass of EmployeeIdentifier, and a
service request called createCompany (namespaces, etc. are left out to
reduce clutter):
<xs:complexType name="EmployeeIdentifier">
...
</xs:complexType>
<xs:complexType name="CoManagerIdentifier">
<xs:complexContent>
<xs:extension base="EmployeeIdentifier">
<xs:sequence>
<xs:element name="dept" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<wsdl:message name="createCompanyRequest">
<wsdl:part name="parameters" element="CreateCompany"/>
</wsdl:message>
The CreateCompany request contains a CoManagerIdentifier:
<xs:element name="CreateCompany">
<xs:complexType>
<xs:sequence>
<xs:element name="manager" type="CoManagerIdentifier"/>
</xs:sequence>
</xs:complexType>
</xs:element>
If I execute the following code:
CreateCompany companyRequest = new CreateCompany();
CoManagerIdentifier coManagerIdentifier = new CoManagerIdentifier();
coManagerIdentifier.setDept("TESTVAL");
companyRequest.setManager(coManagerIdentifier);
CreateCompanyResponse response = stub.createCompany(companyRequest);
, the following message is sent on the wire from the client (minimised
actual SOAP message for clarity):
<soapenv:Body>
<manager><dept>TESTVAL</dept></manager>
</soapenv:Body>
, which is correct and exactly what you would expect.
Now lets change the definition of the CreateCompany request to have a
manager type of EmployeeIdentifier (CoManagerIdentifier's parent). Note, we
will still be dealing with CoManagerIdentifier at runtime:
<xs:element name="CreateCompany">
<xs:complexType>
<xs:sequence>
<xs:element name="manager" type="EmployeeIdentifier"/>
</xs:sequence>
</xs:complexType>
</xs:element>
If the above code is executed once again, the following is what is sent on
the wire from the client:
<soapenv:Body>
<manager xmlns:ns4="http://com.namspace…..."
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="ns4:EmployeeIdentifier" />
</soapenv:Body>
Basically even though the runtime type is CoManagerIdentifier the SOAP
message is generated to have the type EmployeeIdentifier
(xsi:type="ns4:EmployeeIdentifier"). Thus the real type CoManagerIdentifier
and it's attribute (dept with a value of "TESTVAL") is completely ignored.
This only seems to happen when making a client request. When sending a
simillar response from the server (signature of response is the parent type)
the marshaller is able to figure out that it needs to marshall the sub type
(I can post a similar example if necessary).
The code base I am using relies heavily on being able to send inherited
types as part of service requests, so I really need a way of doing this with
Axis2 and JAXB.
Any help greatly appreciated…
Pat Considine
--
View this message in context:
http://www.nabble.com/-Axis2--Sub-types-not-being-marshalled-correctly-tp16964278p16964278.html
Sent from the Axis - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]