[ 
https://issues.apache.org/jira/browse/CXF-2468?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Daniel Kulp resolved CXF-2468.
------------------------------

    Resolution: Fixed

> As stated above the xml reader does not provide the namespace for xsi, but 
> the same test (that attached) shows that it does provide it. 

The XMLStreamReader does not, but the toString method that is used when doing 
println(doc) does.    As mentioned, bug in XMLBeans XMLStreamReader thing.



> writer.writeNamespace(nsPrefix, ns); // <-- FIX: NEW LINE ADDED 

You don't want to do that as ALL attributes that are namespace prefixed would 
end up with new namespace declarations outputted.   The fix I implemented 
checks if the namespace is already declared properly and on writes out the 
namespace decl if it really need to.

See:
http://svn.apache.org/viewvc/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxUtils.java?p2=/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxUtils.java&p1=/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxUtils.java&r1=825221&r2=825220&view=diff&pathrev=825221


> attribute namespace is missed in out message in  case of XmlBeans data binding
> ------------------------------------------------------------------------------
>
>                 Key: CXF-2468
>                 URL: https://issues.apache.org/jira/browse/CXF-2468
>             Project: CXF
>          Issue Type: Bug
>          Components: OtherDatabindings
>            Reporter: Michael Klimiuk
>            Assignee: Daniel Kulp
>            Priority: Blocker
>             Fix For: 2.1.8, 2.2.5
>
>         Attachments: CXF2468.zip
>
>
> 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            }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to