|
|
(6 intermediate revisions by 2 users not shown) |
Line 1: |
Line 1: |
− | {{EclipseLink_UserGuide
| + | Please see http://www.eclipse.org/eclipselink/documentation/2.4/moxy/type_level003.htm |
− | |info=y
| + | |
− | |toc=y
| + | |
− | |eclipselink=y
| + | |
− | |eclipselinktype=MOXy
| + | |
− | }}
| + | |
− | = Handling Inheritance =
| + | |
− | | + | |
− | EclipseLink MOXy provides several ways to represent your inheritance hierarchy in XML.
| + | |
− | | + | |
− | | + | |
− | == Using xsi:type ==
| + | |
− | | + | |
− | By default, EclipseLink will use the '''xsi:type''' attribute to represent inheritance in XML.
| + | |
− | | + | |
− | In this example an abstract super class ('''ContactInfo''') contains all types of contact information. '''Address''' and '''PhoneNumber''' are the concrete implementations of '''ContactInfo'''.
| + | |
− | | + | |
− | <source lang="java">
| + | |
− | public abstract class ContactInfo {
| + | |
− | }
| + | |
− | | + | |
− | public class Address extends ContactInfo {
| + | |
− |
| + | |
− | private String street;
| + | |
− | ...
| + | |
− |
| + | |
− | }
| + | |
− | | + | |
− | public class PhoneNumber extends ContactInfo {
| + | |
− | | + | |
− | private String number;
| + | |
− | ...
| + | |
− |
| + | |
− | }
| + | |
− | </source>
| + | |
− | | + | |
− | | + | |
− | Because the '''Customer''' object can have different types of contact information, its property refers to the superclass.
| + | |
− | | + | |
− | <source lang="java">
| + | |
− | @XmlRootElement
| + | |
− | public class Customer {
| + | |
− |
| + | |
− | private ContactInfo contactInfo;
| + | |
− | ...
| + | |
− |
| + | |
− | }
| + | |
− | </source>
| + | |
− | | + | |
− | | + | |
− | Marshalling an example '''Customer''' would produce the following XML:
| + | |
− | | + | |
− | <source lang="xml">
| + | |
− | <customer>
| + | |
− | <contactInfo
| + | |
− | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
| + | |
− | xsi:type="address">
| + | |
− | <street>323 Main Street</street>
| + | |
− | </contactInfo>
| + | |
− | </customer>
| + | |
− | </source>
| + | |
− | | + | |
− | Note the '''xsi:type''' attribute on the '''contactInfo''' element.
| + | |
− | | + | |
− | | + | |
− | == Using Substitution Groups ==
| + | |
− | | + | |
− | Another way to model inheritance in XML is through XML Schema's ''substitution groups'' functionality. Using this approach, the element name itself determines which subclass to use.
| + | |
− | | + | |
− | Taking the same example from above, we will add '''@XmlRootElement''' annotations to each of the subclasses, which will act as the inheritance indicator.
| + | |
− | | + | |
− | <source lang="java">
| + | |
− | public abstract class ContactInfo {
| + | |
− | }
| + | |
− | | + | |
− | @XmlRootElement
| + | |
− | public class Address extends ContactInfo {
| + | |
− |
| + | |
− | private String street;
| + | |
− | ...
| + | |
− |
| + | |
− | }
| + | |
− | | + | |
− | @XmlRootElement
| + | |
− | public class PhoneNumber extends ContactInfo {
| + | |
− | | + | |
− | private String number;
| + | |
− | ...
| + | |
− |
| + | |
− | }
| + | |
− | </source>
| + | |
− | | + | |
− | | + | |
− | Using this approach, marshalling an example '''Customer''' would produce the following XML:
| + | |
− | | + | |
− | <source lang="xml">
| + | |
− | <customer>
| + | |
− | <address>
| + | |
− | <street>323 Main Street</street>
| + | |
− | </address>
| + | |
− | </customer>
| + | |
− | </source>
| + | |
− | | + | |
− | Note that the '''Address''' object is marshalled to the '''address''' element.
| + | |
− | | + | |
− | | + | |
− | == Using @XmlDescriminatorNode / @XmlDescrimintatorValue ==
| + | |
− | | + | |
− | You can also use the MOXY-specific '''@XmlDescriminatorNode''' and '''@XmlDescrimintatorValue''' annotations available in EclipseLink 2.2 to represent inheritance. With this approach, you can select the attribute to represent the subtype.
| + | |
− | | + | |
− | Using the same example from above, the '''ContactInfo''' class uses the '''@XmlDescriminatorNode''' annotation to specify the XML attribute ('''classifier''') that will hold the subclass indicator. '''Address''' and '''PhoneNumber''' are annotated with '''@XmlDescriminatorValue''', indicating that class' indicator name ('''address-classifier''' and '''phone-number-classifier''').
| + | |
− | | + | |
− | <source lang="java">
| + | |
− | @XmlDiscriminatorNode("@classifier")
| + | |
− | public abstract class ContactInfo {
| + | |
− | }
| + | |
− | | + | |
− | @XmlDiscriminatorValue("address-classifier")
| + | |
− | public class Address extends ContactInfo {
| + | |
− |
| + | |
− | private String street;
| + | |
− | ...
| + | |
− |
| + | |
− | }
| + | |
− | | + | |
− | @XmlDiscriminatorValue("phone-number-classifier")
| + | |
− | public class PhoneNumber extends ContactInfo {
| + | |
− | | + | |
− | private String number;
| + | |
− | ...
| + | |
− |
| + | |
− | }
| + | |
− | </source>
| + | |
− | | + | |
− | | + | |
− | An example '''Customer''' would then produce the following The above sample produces the following XML:
| + | |
− | | + | |
− | <source lang="xml">
| + | |
− | <customer>
| + | |
− | <contactInfo classifier="address-classifier">
| + | |
− | <street>323 Main Street</street>
| + | |
− | </contactInfo>
| + | |
− | </customer>
| + | |
− | </source>
| + | |
− | | + | |
− | Notice that '''Address''' is marshalled to the '''contactInfo''' element. Its '''classifier''' attribute contains the discriminator node value '''address-classifier'''.
| + | |
− | | + | |
− | | + | |
− | | + | |
− | {{EclipseLink_MOXy
| + | |
− | |next= [[/EclipseLink/UserGuide/MOXy/Simple_Values|Simple Values]]
| + | |
− | |previous= n
| + | |
− | |up= [[EclipseLink/UserGuide/MOXy|MOXy User Guide]]
| + | |
− | |version=2.2.0 DRAFT}}
| + | |