[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] [MOXy] mapping inheritance of schema types

Uh, nevermind, it does work.  The key is to make sure every element in the
inheritance hierarchy is set up correctly to refer all the way back up to
Root.  I checked this several times, but there are several "leaf" types and
I missed one.  :P  Then use the "xml schema 'type' attribute" in Root, and
make sure the indicator dictionary has an entry for each type in the
hierarchy.  Then this works fine.  :)

Thanks,
Polly



amphoras wrote:
> 
> Hi,
> 
> My schema defines the following inheritance:  
> 
> 	<xsd:complexType name="RootType" abstract="true">
> 		<xsd:sequence>
> 			<xsd:element ref="field1" minOccurs="0"/>
> 		</xsd:sequence>
> 	</xsd:complexType>
> 
> 	<xsd:complexType name="BranchType" abstract="true">
> 		<xsd:complexContent>
> 			<xsd:extension base="RootType">
> 				<xsd:sequence>
> 					<xsd:element ref="field2" maxOccurs="unbounded"/>
> 				</xsd:sequence>
> 			</xsd:extension>
> 		</xsd:complexContent>
> 	</xsd:complexType>
> 
> 	<xsd:complexType name="LeafType">
> 		<xsd:complexContent>
> 			<xsd:extension base="BranchType">
> 					<xsd:element ref="field3" maxOccurs="unbounded"/>
> 			</xsd:extension>
> 		</xsd:complexContent>
> 	</xsd:complexType>
> 
> The Java classes also mirror this inheritance tree:
> 
> public class Root {
>     private String field1;
> }
> 
> public class Branch extends Root {
>     private String field2;
> }
> 
> public class Leaf extends Branch {
>     private String field3;
> }
> 
> Actually, Root and Branch ought to be abstract classes, but EclipseLink
> threw instantiation exceptions complaining about missing no-arg
> constructor until I took out the "abstract".
> 
> I expect to parse XML that looks like this into the Leaf object:
> 
> <Leaf>
>     <field1>...</field1>
>     <field2>...</field2>
>     <field3>...</field3>
> </Leaf>
> 
> I don't want to redundantly map the fields from Branch and Root in Leaf,
> so I am trying to map each of those classes to its corresponding type in
> the schema.  In the Workbench, I have these settings:
> 
> 1.  Leaf has a mapping for field3, the class is marked as a child
> descriptor, and its parent is Branch.  
> 2.  Branch has a mapping for field2, the class is marked as a child
> descriptor, and its parent is Root.  
> 3.  Root has a mapping for field1, the class is marked as a parent, and
> then... I'm stuck.
> 
> The problem is:
> * I cannot use the Class Extraction Method, because it looks like this
> hook is never called for XML projects.
> 
> * I cannot use the Class Indicator Field's "xml schema type attribute",
> because I assume this means that I need an an attribute like
> "xsi:type='Leaf'", and my schema does not allow this attribute.
> 
> * I cannot use the Class Indicator Field's "specify field" setting because
> there's no element inside the <Leaf></Leaf> tags that will tell me what
> class to use.  
> 
> So I am perplexed.  How come EclipseLink can't tell that it should use the
> Leaf class if the xml element name is "Leaf"?  I have already set the
> "Schema Context" to "Leaf".  Why does EclipseLink need something else to
> tell it what type to use?  
> 
> Is there a better way to specify inheritance in XML mappings without
> having to use the Map Inherited Attributes -> To Root Minus One option? 
> That would force me to remap the same attributes over and over again and
> be a pain if the root definition ever changes.  
> 
> Thanks for your help,
> Polly
> 

-- 
View this message in context: http://www.nabble.com/-MOXy--mapping-inheritance-of-schema-types-tp18691564p18692390.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.