[ http://issues.apache.org/jira/browse/AXIS2-1129?page=all ]
Davanum Srinivas updated AXIS2-1129: ------------------------------------ Priority: Blocker (was: Critical) > Doubled wrapper elements around XMLBeans-generated XML > ------------------------------------------------------ > > Key: AXIS2-1129 > URL: http://issues.apache.org/jira/browse/AXIS2-1129 > Project: Apache Axis 2.0 (Axis2) > Issue Type: Bug > Components: core, om, wsdl, client-api, databinding > Affects Versions: 1.0 > Reporter: Derek Foster > Priority: Blocker > > I recently noticed a big problem in how Axis2 generates XML for XMLBeans > objects. It appears to be creating the wrapper element around > an XMLBean twice, thus generating erroneous XML for a SOAP message. This > appears to be a big problem that would affect a lot of web services, and is > making it impossible for my company to use Axis2 to talk to our server. > This error was found in the latest nightly build (September 8), but has > apparently been around for some time. > I have a particular WSDL, as follows: > <?xml version="1.0" encoding="UTF-8"?> > <definitions name="FDefinitions" > targetNamespace="http://www.c-corp.com/wsdl/2004-10-01/F" > xmlns:tns="http://www.c-corp.com/wsdl/2004-10-01/F" > xmlns:c="http://www.c-corp.com/wsdl/2004-10-01/c" > xmlns:F="http://www.dummy-temp-address" > xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" > xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" > xmlns:xs="http://www.w3.org/2001/XMLSchema" > xmlns="http://schemas.xmlsoap.org/wsdl/"> > <types> > <xs:schema targetNamespace="http://www.c-corp.com/wsdl/2004-10-01/F"> > <xs:import namespace="http://www.dummy-temp-address" > schemaLocation="F.xsd"/> > <xs:element name="return" type="xs:string"/> > <xs:element name="failure" type="xs:string"/> > </xs:schema> > <xs:schema targetNamespace="http://www.c-corp.com/wsdl/2004-10-01/c"> > <xs:element name="CPassword" type="xs:string"/> > <xs:element name="CLogin" type="xs:string"/> > </xs:schema> > </types> > <message name="FEvent"> > <part name="contents" element="F:full"/> > </message> > <message name="FResponse"> > <part name="return" element="tns:return"/> > </message> > <message name="CPassword"> > <part name="CPassword" element="c:CPassword"/> > </message> > <message name="CLogin"> > <part name="CLogin" element="c:CLogin"/> > </message> > <message name="Failure"> > <part name="faultDetail" element="tns:failure"/> > </message> > <portType name="FPortType"> > <documentation>F Port Type</documentation> > <operation name="acceptFEvent" parameterOrder="contents"> > <input name="acceptFEventRequest" message="tns:FEvent"/> > <output name="acceptFEventResponse" message="tns:FResponse"/> > <fault name="Failure" message="tns:Failure"/> > </operation> > </portType> > <binding name="FSoapBinding" type="tns:FPortType"> > <documentation>F Soap Binding</documentation> > <soap:binding style="document" > transport="http://schemas.xmlsoap.org/soap/http"/> > <operation name="acceptFEvent"> > <soap:operation soapAction="acceptFEventAction"/> > <input> > <soap:header message="tns:CLogin" part="CLogin" use="literal"/> > <soap:header message="tns:CPassword" part="CPassword" > use="literal"/> > <soap:body use="literal"/> > </input> > <output> > <soap:body use="literal"/> > </output> > <fault name="Failure"> > <soap:fault name="Failure" use="literal"/> > </fault> > </operation> > </binding> > <service name="FService"> > <documentation>F Web Service</documentation> > <port name="FPort" binding="tns:FSoapBinding"> > <soap:address > location="http://localhost:8080/axis/services/FService"/> > </port> > </service> > </definitions> > My WSDL references the following XML schema: > <?xml version="1.0" encoding="UTF-8"?> > <xs:schema targetNamespace="http://www.dummy-temp-address" > xmlns="http://www.dummy-temp-address" > xmlns:xs="http://www.w3.org/2001/XMLSchema" > xmlns:c="http://www.c-corp.com/schemas/c/schema_annotation" > elementFormDefault="unqualified" > attributeFormDefault="unqualified" > version="DRAFT"> > <xs:element name="full" type="Full"/> > <xs:complexType name="Full"> > <xs:sequence> > <xs:element name="message-header" type="MessageHeader"/> > <xs:element name="event-reference" type="EventReference"/> > <xs:any/> > </xs:sequence> > </xs:complexType> > <xs:complexType name="MessageHeader"> > <xs:sequence> > <xs:any/> > </xs:sequence> > </xs:complexType> > <xs:complexType name="EventReference"> > <xs:sequence> > <xs:element name="event-id" type="xs:string"/> > <xs:element name="update" type="xs:unsignedInt"/> > <xs:element name="response-plan-id" type="xs:string" minOccurs="0"/> > </xs:sequence> > </xs:complexType> > </xs:schema> > After running WSDL2Java to generate the appropriate classes, I am using the > following code to generate and transmit a client message to my SOAP server: > protected ReturnDocument executeTest ( > final String targetEndpoint, > final CLoginDocument login, > final CPasswordDocument password ) > throws Exception > { > final FServiceStub service = new FServiceStub( null, targetEndpoint ); > final Options options = service._getServiceClient().getOptions(); > options.setProperty( > org.apache.axis2.transport.http.HTTPConstants.CHUNKED, Boolean.FALSE ); > service._getServiceClient().setOptions( options ); > final FullDocument full = Full.Factory.newInstance(); > full.setFull( getSituation() ); > return service.acceptFEvent( full, login, password ); > } > private Full getSituation () > throws XmlException > { > return Full.Factory.parse( > " <full xmlns=\"http://www.dummy-temp-address\">\n" + > " <message-header>\n" + > ... and so forth: see output for the rest of this string ... > " </details>\n" + > " </full>\n" ); > } > When I execute the above code, I get the following message sent to my server: > POST /axis2/services/FService HTTP/1.1 > SOAPAction: acceptFEventAction > User-Agent: Axis2 > Host: 127.0.0.1 > Content-Length: 8785 > Content-Type: text/xml; charset=UTF-8 > <?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope > xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><CLogin > > xmlns="http://www.c-corp.com/wsdl/2004-10-01/c">admin</CLogin></soapenv:Header><soapenv:Body><full > xmlns="http://www.dummy-temp-address"><full> > <message-header> > <sender> > <organization-id>QSenderOrganizationID</organization-id> > <center-id>QSenderCenterID</center-id> > </sender> > <message-type-version>1</message-type-version> > <message-number>435</message-number> > <message-time-stamp> > <date>20040625</date> > <time>201225</time> > <utc-offset>-0400</utc-offset> > </message-time-stamp> > <message-expiry-time> > <date>20040625</date> > <time>221222</time> > <utc-offset>-0400</utc-offset> > </message-expiry-time> > </message-header> > <event-reference> > <event-id>1234</event-id> > <update>1</update> > </event-reference> > <event-indicators> > <event-indicator> > <priority>4</priority> > </event-indicator> > </event-indicators> > <headline> > <headline> > <incident>accident</incident> > </headline> > </headline> > <details> > </details> > </full></full></soapenv:Body></soapenv:Envelope> > Note that there is a doubled 'full' element in the output (one inside the > other). There should be only one level of 'full', but there are two, > one inside the other. This is very wrong, and is unsurprisingly rejected by > my server. > Calling toString() on the results of getSituation() returns the string that > was passed into the Factory.parse() method as I would expect. > Calling toString() on the FullDocument instance results in two levels of > 'full', not one as it should. > It occurred to me that maybe I should not be including a declaration for > 'full' in the string passed to Factory.parse() (note that there is no > documentation as to what should be passed into Factory.parse(),making it > difficult to interpret), so I tried omitting the outer 'full' tag and its > close tag, and just included the elements that it contains. However, when > doing this, I got errors from the parse method complaining > that there was more than one element present in the string being parsed. So > although it seems to be possible to generate correct XML via this method as > long as there is only a single child element of the 'full' element, this is > not an acceptable solution in my case. > I tried changing the declaration of the 'full' element so that it had > minOccurs=0 maxOccurs="unbounded". This caused WSDL2Java to declare the type > of it as an array rather than a single instance. However, this merely meant > that each element in the array was surrounded by two 'full' tags, rather than > one. > This seems to me to be a fairly blatant error which would affect almost all > use of XMLBeans binding. I would like to have this considered > a blocker for Axis 1.1. > Derek -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]