You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Daniel Kulp (JIRA)" <ji...@apache.org> on 2009/12/14 19:17:18 UTC

[jira] Resolved: (CXF-2519) Incorrect handling of qualified attributes and default namespace when marshalling

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

Daniel Kulp resolved CXF-2519.
------------------------------

       Resolution: Not A Problem
    Fix Version/s: Invalid


Marking this as "Not a problem".   CXF, by default, doesn't use the default namespace so normally would not be exposed to this bug in JAXB.   In anycase, it IS a JAXB issue and not really much we can do about it.

> 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
>             Fix For: Invalid
>
>
> 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.