| Posted on 2009-02-10 10:11:03-08 by noah |
| Deserialization failure when using abstract elements |
|
I'm currently coding a SOAP client to an interface defined by the WSDL below (namespaces changed to protect the guilty). I get the following error:
Error deserializing message: Cannot resolve searchZonesResponse/return/records/dnsName via MyTypema
+ps::dnswsImplService
The XML response looks like this:
<?xml version="1.0"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:searchZonesResponse xmlns:ns2="http://dbdns.ws.example.com/" xmlns:ns3="http://ws.example.
+com">
<return>
<resultCode>100</resultCode>
<records xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:forwardRecordO
+bject">
<ttl>0</ttl>
<dnsName>www.example.com</dnsName>
<ipAddress>192.168.1.101</ipAddress>
</records>
</return>
</ns2:searchZonesResponse>
</S:Body>
</S:Envelope>
So, I get back a baseRecordObject sets the type to forwardRecordObject. Thus (in theory) since forw
+ardRecordObject inherits from baseRecordObject I should have the 'ttl' field from the baseRecordOb
+ject and all fields from the forwardRecordObject, the Typemaps lookup should do its thing, and all
+ should be well. Instead, the Typemaps hash has no values containing the forwardRecordObject class
+. I can make this work with some minor hackery to SOAP::WSDL::Expat::MessageParser and adding some
+ dummy entries to the MyTypemaps file, but I suspect that's not the correct solution. =) Is this
+something that wsdl2perl should be handling, or do I need to handle this on my end?
WSDL:
<?xml version='1.0' encoding='UTF-8'?>
<definitions
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://dbdns.ws.example.com/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="http://dbdns.ws.example.com/"
name="dnswsImplService"
>
<types>
<xsd:schema>
<xsd:element name="searchZones" type="tns:searchZones" />
<xsd:element name="searchZonesResponse" type="tns:searchZonesResponse" />
<xsd:complexType name="baseReturnObject">
<xsd:sequence>
<xsd:element name="message" type="xsd:string" minOccurs="0" />
<xsd:element name="resultCode" type="xsd:int" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="searchReturnObject">
<xsd:complexContent>
<xsd:extension base="tns:baseReturnObject">
<xsd:sequence>
<xsd:element name="records" type="tns:baseRecordObject" nillable="true" minOccurs="0" maxOccurs
+="unbounded" />
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="baseRecordObject" abstract="true">
<xsd:sequence>
<xsd:element name="ttl" type="xsd:string" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="forwardRecordObject">
<xsd:complexContent>
<xsd:extension base="tns:baseRecordObject">
<xsd:sequence>
<xsd:element name="dnsName" type="xsd:string" minOccurs="0" />
<xsd:element name="ipAddress" type="xsd:string" minOccurs="0" />
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="reverseRecordObject">
<xsd:complexContent>
<xsd:extension base="tns:baseRecordObject">
<xsd:sequence>
<xsd:element name="dnsName" type="xsd:string" minOccurs="0" />
<xsd:element name="ipAddress" type="xsd:string" minOccurs="0" />
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="aliasRecordObject">
<xsd:complexContent>
<xsd:extension base="tns:baseRecordObject">
<xsd:sequence>
<xsd:element name="alias" type="xsd:string" minOccurs="0" />
<xsd:element name="canonicalName" type="xsd:string" minOccurs="0" />
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="toolLicense">
<xsd:sequence>
<xsd:element name="license" type="xsd:string" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="searchZones">
<xsd:sequence>
<xsd:element name="license_key" type="tns:toolLicense" minOccurs="0" />
<xsd:element name="userId" type="xsd:string" minOccurs="0" />
<xsd:element name="dnsName" type="xsd:string" minOccurs="0" />
<xsd:element name="ipAddress" type="xsd:string" minOccurs="0" />
<xsd:element name="responseTypes" type="tns:recordType" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="searchZonesResponse">
<xsd:sequence>
<xsd:element name="return" type="tns:searchReturnObject" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="recordType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="RR_A" />
<xsd:enumeration value="RR_CNAME" />
<xsd:enumeration value="RR_PTR" />
<xsd:enumeration value="RR_HINFO" />
<xsd:enumeration value="RR_MX" />
<xsd:enumeration value="RR_NS" />
<xsd:enumeration value="RR_SOA" />
<xsd:enumeration value="RR_SRV" />
<xsd:enumeration value="RR_TXT" />
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
</types>
<message name="searchZones">
<part name="parameters" element="tns:searchZones" />
</message>
<message name="searchZonesResponse">
<part name="parameters" element="tns:searchZonesResponse" />
</message>
<portType name="dnsws">
<operation name="searchZones">
<input message="tns:searchZones" />
<output message="tns:searchZonesResponse" />
</operation>
</portType>
<binding name="dnswsImplPortBinding" type="tns:dnsws">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
<operation name="searchZones">
<soap:operation soapAction="" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>
</binding>
<service name="dnswsImplService">
<port name="dnswsImplPort" binding="tns:dnswsImplPortBinding"><soap:address location="http://servic
+e.example.com/dbdns/services/v1_r0/" />
</port>
</service>
</definitions>
|
| Direct Responses: 9916 | Write a response |