I wanted to build an awesome place for people to discuss module specific issues, but I don't have any more time for this, and there are much better places to discuss Perl-related issues. I'd recommend asking your question on Stack Overflow or on Perl Monks.
If you are looking for a Perl tutorial or Perl-related news, I hope these links will serve you well.
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