Hi guys, I had a piece of code that was working perfectly fine. I went on to work on something else in my app, updated a few gems in the process... Now the first bit of code doesn''t work anymore, and I am lost. It seems soap4r has decided to do things wrong - but I don''t know which gem is impacting it. The wsdl element is: <xs:element name="GetUserDetailRequest"> <xs:complexType> <xs:complexContent> <xs:extension base="tns:RequestBase"> <xs:choice> <xs:element name="Id" type="xs:long"> </xs:element> <xs:element name="SecondId" type="xs:string"> </xs:element> </xs:choice> </xs:extension> </xs:complexContent> </xs:complexType> </xs:element> with RequestBase: <xs:complexType name="RequestBase"> <xs:sequence> <xs:element name="LocalStuff" type="xs:string"> </xs:element> <xs:element name="CodeP" type="xs:string"> </xs:element> </xs:sequence> </xs:complexType> When I call: result = driver.getUserDetail(:CodeP => xxx, :LocalStuff => xxx, :Id => xxx) the SOAP message generated is: <?xml version="1.0" encoding="utf-8" ?> <env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <env:Body> <n1:GetUserDetailRequest xmlns:n1="http://mywsdl"> <n1:LocalStuff>en-GB</n1:LocalStuff> </n1:GetUserDetailRequest> </env:Body> </env:Envelope> which is wrong (notably it misses CodeP) and returns an error from the webservice. It used to work perfectly. Do you guys know which gem update could be "conflicting" with soap4r? Thanks!
I ran wsdl2ruby on the WSDL file, and indeed, the defaultMappingRegistry.rb file has changed, and it is now wrong: NOW: LiteralRegistry.register( :class => GetUsertDetailRequest, :schema_name => XSD::QName.new(NsC_0, "GetUsertDetailRequest"), :schema_element => [ :choice, ["localStuff", ["SOAP::SOAPString", XSD::QName.new(NsC_0, "LocalStuff")]], ["codeP", ["SOAP::SOAPString", XSD::QName.new(NsC_0, "CodeP")]], ["id", ["SOAP::SOAPLong", XSD::QName.new(NsC_0, "Id")]], ["secondId", ["SOAP::SOAPString", XSD::QName.new(NsC_0, "SecondId")]] ] ) the parameters shouldn''t be a choice like that. Indeed, they WERE: LiteralRegistry.register( :class => GetUsertDetailRequest, :schema_name => XSD::QName.new(NsC_0, "GetUsertDetailRequest"), :schema_element => [ ["localStuff", ["SOAP::SOAPString", XSD::QName.new(NsC_0, "LocalStuff")], [0, 1]], ["codeP", ["SOAP::SOAPString", XSD::QName.new(NsC_0, "CodeP")], [0, 1]], [ :choice, ["id", ["SOAP::SOAPLong", XSD::QName.new(NsC_0, "Id")]], ["secondId", ["SOAP::SOAPString", XSD::QName.new(NsC_0, "SecondId")], [0, 1]] ] ] ) I have only used one version of soap4r (1.5.8) so I guess the problem has to come from the xml parsing. Has anyone experienced issues with soap4r in the recent weeks? Thanks!
I had a similar issue, it looks like xs:choice gets interpreted incorrectly when xs:choice follows xs:extension Then elements from the extension get included in the choice and the mapping is incorrect as you describe. I had to manually edit the generated registry. It might indeed be a bug in soap4r. I have soap4r 1.5.8 and generated my mappings several months ago (around March) so I don''t think it''s a very recent issue.