[ http://issues.apache.org/jira/browse/AXIS2-1129?page=all ]
Davanum Srinivas resolved AXIS2-1129.
-------------------------------------
Resolution: Fixed
With latest SVN, please qualify your schema type explicitly ("<xs:element
name="full" type="tns:Full"/>") as follows:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:tns="http://www.dummy-temp-address"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:c="http://www.c-corp.com/schemas/c/schema_annotation"
targetNamespace="http://www.dummy-temp-address"
elementFormDefault="unqualified" attributeFormDefault="unqualified"
version="DRAFT">
<xs:element name="full" type="tns:Full"/>
<xs:complexType name="Full">
<xs:sequence>
<xs:element name="message-header"
type="tns:MessageHeader"/>
<xs:element name="event-reference"
type="tns: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>
Then change the getSituation as follows:
private static FullDocument getSituation()
throws XmlException {
return FullDocument.Factory.parse(
"<full xmlns=\"http://www.dummy-temp-address\">\n" +
// SNIPPED.
"</full>");
}
Then in your method use as follows:
final FullDocument full = FullDocument.Factory.newInstance();
full.setFull(getSituation().getFull());
service.acceptFEvent(full, null, null);
This works for me and generates the following soap message:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<full xmlns="http://www.dummy-temp-address">
<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>
</soapenv:Body>
</soapenv:Envelope>
*PLEASE* note that this is all quirkiness in xmlbeans. you get the correct
serialization when you do a toString() is a red herring. If you wrap it in a
FullDocument and then call toString() you will see the same problem that we are
having.
thanks,
dims
> 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]