Incorrect handling of qualified attributes and default namespace when 
marshalling
---------------------------------------------------------------------------------

                 Key: CXF-2519
                 URL: https://issues.apache.org/jira/browse/CXF-2519
             Project: CXF
          Issue Type: Bug
          Components: JAXB Databinding
    Affects Versions: 2.2.4
         Environment: Windows Vista
            Reporter: Yaytay


This is part of my schema (the whole thing is quite complex and inline 
in a WSDL document):
        <xsd:schema targetNamespace="http://yaytay"; xmlns:tns="http://yaytay"; 
                    attributeFormDefault="qualified"
                    elementFormDefault="qualified">
            <xsd:element name="ScheduledEmailQueryRequest" 
type="tns:ScheduledEmailQueryRequestType"></xsd:element>
            <xsd:element name="ScheduledEmailQueryResponse" 
type="tns:ScheduledEmailQueryResponseType"></xsd:element>
...
            <xsd:complexType name="ScheduledEmailQueryResponseType">
                <xsd:sequence>
                    <xsd:element name="Message" 
type="tns:EmailMessageDefinition" maxOccurs="unbounded" 
minOccurs="0"></xsd:element>
                </xsd:sequence>
            </xsd:complexType>
            <xsd:complexType name="EmailMessageDefinition">
                <xsd:sequence>
                    <xsd:element name="To" minOccurs="0" 
type="tns:EmailRecipient" maxOccurs="unbounded"></xsd:element>
                    <xsd:element name="From" 
type="tns:EmailAddress"></xsd:element>
                    <xsd:element name="Subject" 
type="xsd:normalizedString"></xsd:element>
...
                </xsd:sequence>
                <xsd:attribute name="ID" type="xsd:string" use="required"/>
            </xsd:complexType>

The noticeable thing is that the EmailMessageDefinition element has an 
attribute called ID and that it should be namespace qualified 
(attributeFormDefault="qualified" ).

Using CXF as a SOAP processor works correctly for everything I've tried with it 
so far, my problem comes when I try to marshall an EmailMessageDefinition 
manually:

        EmailMessageDefinition defn = createMessageDefinition( "id", "payload" 
);  // returns an EmailMessageDefinition with the id set to "id" and some 
standard recipients

        try
        {
            JAXBDataBinding binding = new JAXBDataBinding();
            JAXBContext jc = JAXBContext.newInstance( 
"yaytay.emailschedulertarget" );
            Marshaller marshaller = jc.createMarshaller();
            StringWriter writer = new StringWriter();

            marshaller.marshal( new JAXBElement( new QName( "http://yaytay";, 
"EmailMessageDefinition" ), 
                                                 EmailMessageDefinition.class, 
                                                 defn ), 
                                writer );
            System.out.println( writer.toString() );

That gives:
<?xml version="1.0" encoding="UTF-8" 
standalone="yes"?><ns1:EmailMessageDefinition ns1:ID="id" 
xmlns:ns1="http://yaytay";>...</ns1:EmailMessageDefinition>
Which is correct, but the namespace is repeated all over the place and is ugly.

So I try to make it the default namespace by adding:
    private class NamespaceMapper extends NamespacePrefixMapper
    {

        @Override
        public String getPreferredPrefix( String namespaceUri, String 
suggestion, boolean requirePrefix )
        {
            if( "http://yaytay".equals( namespaceUri ) )
            {
                return "";
            }
            else
            {
                return suggestion;
            }
        }

    }

And this is the result:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><EmailMessageDefinition 
ID="id" xmlns="http://yaytay";>...</EmailMessageDefinition>
That result is wrong, according to the schema, because the attribute is not 
affected by the default namespace.
This can be demonstrated by unmarshalling the result, which fails to set the ID 
on the resulting object.

I tried adding:
        @Override
        public String[] getPreDeclaredNamespaceUris2()
        {
            String[] result = { "ns", "http://yaytay"; };
            return result;
        }
but that didn't help:
<?xml version="1.0" encoding="UTF-8" 
standalone="yes"?><ns:EmailMessageDefinition ID="id" xmlns="http://yaytay"; 
xmlns:ns="http://yaytay";>...</ns:EmailMessageDefinition>

I think the marshaller needs special handling for qualified attributes 
with an enforced default namespace.


-- 
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