Details
-
Bug
-
Status: Closed
-
Blocker
-
Resolution: Fixed
-
None
-
None
Description
SCENARIO:
The XmlBeans databinding is used.
Trying to send a message with an input data like:
<myOperation
xmlns="http://sandbox.org/services/MyService/myOperation"
xmlns:s1="http://sandbox.org/datatypes/one"
xmlns:s2="http://sandbox.org/datatypes/two"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<data>
<s1:oneElement>
<s2:twoElement xsi:nil="true"/>
</s1:oneElement>
</data>
</myOperation>
ACTUAL RESULT:
The out message is generated as follows:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<myOperation xmlns="http://sandbox.org/services/MyService/myOperation">
<data>
<oneElement xmlns="http://sandbox.org/datatypes/one">
<twoElement xmlns="http://sandbox.org/datatypes/two" xsi:nil="true"/>
</oneElement>
</data>
</myOperation>
</soap:Body>
</soap:Envelope>
Namespace definition for "xsi" prefix is missed. And the receiver fails to process the message because of validation.
EXPECTED RESULT:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<myOperation xmlns="http://sandbox.org/services/MyService/myOperation">
<data>
<oneElement xmlns="http://sandbox.org/datatypes/one">
<twoElement xmlns="http://sandbox.org/datatypes/two"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:nil="true"/>
</oneElement>
</data>
</myOperation>
</soap:Body>
</soap:Envelope>
I.e. the namespace for "xsi" prefix is present.
ANALYSIS:
Analysis is based on the CXF 2.2.3.
Please have a look at the sources:
Class: org.apache.cxf.staxutils.StaxUtils
Method: writeStartElement(XMLStreamReader reader, XMLStreamWriter writer)
The code under his comment -> // Write out attributes
My guess is:
If we have both "ns" and "nsPrefix" that are not empty then the namespace definition should be written.
506 } else
{ 507 writer.writeNamespace(nsPrefix, ns); // <-- THIS IS A NEW EXAMPLE LINE OF WHAT IS DESIRED 508 writer.writeAttribute(reader.getAttributePrefix(i), reader.getAttributeNamespace(i), reader 509 .getAttributeLocalName(i), reader.getAttributeValue(i)); 510 }