Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[eclipselink-users] [MOXy] default namespace + inheritance + default root element doesn't work?

Hi,

I have successfully unmarshalled classes using the default namespace +
inheritance or default namespace + default root element.  However, this is
the first time that I'm trying to combine default namespace + inheritance +
default root element.  This combination does not seem to work.  Please let
me know if I'm doing something wrong.

I have a class named Description that extends from Text.  I am using a
default namespace and making Description the default root element.  The
mapping looks like this:

		<class-mapping-descriptor xsi:type="xml-class-mapping-descriptor"> 
			<class>com.foo.Description</class>  
			<alias>Description</alias>  
			<inheritance xsi:type="qname-inheritance-policy"> 
				<parent-class>com.foo.Text</parent-class> 
			</inheritance>  
			<events xsi:type="event-policy"/>  
			<querying xsi:type="query-policy"/>  
			<attribute-mappings> 
				<attribute-mapping xsi:type="xml-direct-mapping"> 
					<attribute-name>type</attribute-name>  
					<field name="@type" xsi:type="node"/> 
				</attribute-mapping> 
			</attribute-mappings>  
			<descriptor-type>aggregate</descriptor-type>  
			<instantiation/>  
			<copying xsi:type="instantiation-copy-policy"/>  
			<default-root-element>Description</default-root-element>  
			<default-root-element-field name="Description" xsi:type="node"> 
				<leaf-element-type>DescriptionType</leaf-element-type> 
			</default-root-element-field>  
			<namespace-resolver> 
				<namespaces/>  
			
<default-namespace-uri>http://www.foo.com/bar/baz</default-namespace-uri> 
			</namespace-resolver>  
			<schema xsi:type="schema-file-reference"> 
				<schema-context>/DescriptionType</schema-context>  
				<node-type>complex-type</node-type> 
			</schema> 
		</class-mapping-descriptor>  

The mapping for the superclass Text looks like:
		<class-mapping-descriptor xsi:type="xml-class-mapping-descriptor"> 
			<class>com.foo.Text</class>  
			<alias>Text</alias>  
			<inheritance xsi:type="qname-inheritance-policy"> 
				<class-indicator-field name="@dummy" xsi:type="node"/>  
				<class-indicator-mappings> 
					<class-indicator-mapping> 
						<class>com.foo.Description</class>  
						<class-indicator
xsi:type="xsd:string">DescriptionType</class-indicator> 
					</class-indicator-mapping>  
					<class-indicator-mapping> 
						<class>com.foo.Text</class>  
						<class-indicator xsi:type="xsd:string">TextType</class-indicator> 
					</class-indicator-mapping> 
				</class-indicator-mappings> 
			</inheritance>  
			<events xsi:type="event-policy"/>  
			<querying xsi:type="query-policy"/>  
			<attribute-mappings> 
				<attribute-mapping xsi:type="xml-direct-mapping"> 
					<attribute-name>value</attribute-name>  
					<field name="text()" xsi:type="node"/> 
				</attribute-mapping>  
				<attribute-mapping xsi:type="xml-direct-mapping"> 
					<attribute-name>languageID</attribute-name>  
					<field name="@languageID" xsi:type="node"/> 
				</attribute-mapping> 
			</attribute-mappings>  
			<descriptor-type>aggregate</descriptor-type>  
			<instantiation/>  
			<copying xsi:type="instantiation-copy-policy"/>  
			<namespace-resolver> 
				<namespaces/>  
			
<default-namespace-uri>http://www.foo.com/bar/baz</default-namespace-uri> 
			</namespace-resolver>  
			<schema xsi:type="schema-file-reference"> 
				<schema-context>/TextType</schema-context>  
				<node-type>complex-type</node-type> 
			</schema> 
		</class-mapping-descriptor>  

The test XML file does not have the "class-indicator-field" attribute
"dummy" because we will never get an XML file with that inside it.  I have
found that simply having the "class-indicator-mappings" has been enough for
nodes that are not a default root element.  However, since this class is a
default root element, the SAXUnmarshallerHandler.startElement finds the
"leafElementType" under the comment "no xsi:type attribute - look for type
indicator on the default root element".  The default root element is a QName
with the value "DescriptionType" but no namespace.  The code should be able
to "get the class from the inheritance policy", because the map contains: 

{class com.foo.Text=TextType, 
class com.foo.Description=DescriptionType, 
DescriptionType=class com.foo.Description, 
TextType=class com.foo.Text, 
{http://www.foo.com/bar/baz}TextType=class com.foo.Text, 
{http://www.foo.com/bar/baz}DescriptionType=class com.foo.Description}

However, the problems appears to be that the QName type does not match the
key type of String.  So the class name cannot be retrieved, and I get an
exception:

Caused by: Exception [EclipseLink-43] (Eclipse Persistence Services - 1.0.1
(Build 20080905)): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Missing class for indicator field value
[DescriptionType] of type [class javax.xml.namespace.QName].
Descriptor: XMLDescriptor(com.foo.Description -->
[DatabaseTable(Description)])
	at
org.eclipse.persistence.exceptions.DescriptorException.missingClassForIndicatorFieldValue(DescriptorException.java:906)
	at
org.eclipse.persistence.internal.oxm.record.SAXUnmarshallerHandler.startElement(SAXUnmarshallerHandler.java:246)
	at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
	at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown
Source)
...

It seems like the QName should either have the default namespace included or
a String should be used to do the matching.  However, if I'm doing something
wrong in my mapping, please let me know how I can fix it.

Thank you so much for your help!
--Polly
-- 
View this message in context: http://www.nabble.com/-MOXy--default-namespace-%2B-inheritance-%2B-default-root-element-doesn%27t-work--tp20276491p20276491.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.



Back to the top