Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "EclipseLink/UserGuide/MOXy/Type Level/Handling Inheritance"

m (Handling Inheritance)
m (Handling Inheritance)
Line 2: Line 2:
  
 
* [[#xsitype|xsi:Type Attribute]]
 
* [[#xsitype|xsi:Type Attribute]]
 +
* [[#substitution|Substitution Groups]]
 +
  
 
<span id="xsitype"></span>
 
<span id="xsitype"></span>
Line 101: Line 103:
 
</source>
 
</source>
 
Note the '''xsi:type''' attribute on the '''contactInfo''' element.
 
Note the '''xsi:type''' attribute on the '''contactInfo''' element.
 +
 +
 +
<span id="substitution"></span>
 +
==Using Substitution Groups==
 +
You can represent inheritance by using the element name with XML schema ''substitution groups''.
 +
 +
In this example, the Java model contains an abstract superclass, '''ContactInfo''' for all types of contact information. '''Address''' and '''PhoneNumber''' are the concrete implementations of '''ContactInfo'''. 
 +
 +
<source lang="java">
 +
 +
package blog.inheritance;
 +
 +
import javax.xml.bind.annotation.XmlRootElement;
 +
 +
public abstract class ContactInfo {
 +
 +
}
 +
 +
@XmlRootElement
 +
public class Address extends ContactInfo {
 +
 +
    private String street;
 +
 +
    public String getStreet() {
 +
        return street;
 +
    }
 +
 +
    public void setStreet(String street) {
 +
        this.street = street;
 +
    }
 +
 +
}
 +
 +
@XmlRootElement
 +
public class PhoneNumber extends ContactInfo {
 +
 +
}
 +
 +
</source>
 +
 +
Both '''Address''' and '''PhoneNumber''' use the '''@XmlRootElement''' annotation because the element name is used as the inheritance indicator.
 +
 +
 +
Because the '''Customer''' object can have different types of contact information, its property refers to the superclass. The '''contactInfo''' property includes the '''@XmlElementRef''' annotation to indicate the value type will be derived from the element name (and namespace URI).
 +
 +
<source lang="java">
 +
package blog.inheritance;
 +
 +
import javax.xml.bind.annotation.XmlElementRef;
 +
import javax.xml.bind.annotation.XmlRootElement;
 +
 +
@XmlRootElement
 +
public class Customer {
 +
 +
    private ContactInfo contactInfo;
 +
 +
    @XmlElementRef
 +
    public ContactInfo getContactInfo() {
 +
        return contactInfo;
 +
    }
 +
 +
    public void setContactInfo(ContactInfo contactInfo) {
 +
        this.contactInfo = contactInfo;
 +
    }
 +
 +
}
 +
 +
</source>
 +
 +
In the following example, the '''xsi:type''' attribute represents inheritance.
 +
 +
<source lang="java">
 +
 +
package blog.inheritance;
 +
 +
import javax.xml.bind.JAXBContext;
 +
import javax.xml.bind.Marshaller;
 +
 +
public class Demo {
 +
 +
    public static void main(String[] args) throws Exception {
 +
        Customer customer = new Customer();
 +
        Address address = new Address();
 +
        address.setStreet("1 A Street");
 +
        customer.setContactInfo(address);
 +
 +
        JAXBContext jc = JAXBContext.newInstance(Customer.class, Address.class, PhoneNumber.class);
 +
 +
        Marshaller marshaller = jc.createMarshaller();
 +
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
 +
        marshaller.marshal(customer, System.out);
 +
    }
 +
 +
}
 +
</source>
 +
 +
The above sample code produces the following XML.
 +
<source lang="xml">
 +
 +
<customer>
 +
    <address>
 +
        <street>1 A Street</street>
 +
    </address>
 +
</customer>
 +
 +
</source>
 +
 +
Note that the '''Address''' object is marshalled to the '''address''' element.

Revision as of 10:41, 24 March 2011

Handling Inheritance


Using xsi:type Attribute

You can use the xsi:type attribute to represent inheritance in JAXB.

In this example an abstract super class ('ContactInfo) contains all types of contact information. Address and PhoneNumber are the concrete implementations of ContactInfo.

package blog.inheritance;
 
public abstract class ContactInfo {
 
}
 
public class Address extends ContactInfo {
 
    private String street;
 
    public String getStreet() {
        return street;
    }
 
    public void setStreet(String street) {
        this.street = street;
    }
 
}
 
public class PhoneNumber extends ContactInfo {
 
}


Because the Customer object can have different types of contact information, its property refers to the superclass.

 
package blog.inheritance;
 
import javax.xml.bind.annotation.XmlRootElement;
 
@XmlRootElement
public class Customer {
 
    private ContactInfo contactInfo;
 
    public ContactInfo getContactInfo() {
        return contactInfo;
    }
 
    public void setContactInfo(ContactInfo contactInfo) {
        this.contactInfo = contactInfo;
    }
 
}


In this example, the xsi:type attribute represents inheritance.

 
package blog.inheritance;
 
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
 
public class Demo {
 
    public static void main(String[] args) throws Exception {
        Customer customer = new Customer();
        Address address = new Address();
        address.setStreet("1 A Street");
        customer.setContactInfo(address);
 
        JAXBContext jc = JAXBContext.newInstance(Customer.class, Address.class, PhoneNumber.class);
 
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(customer, System.out);
    }
 
}

The above sample code produces the following XML.

 
<customer>
    <contactInfo 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:type="address">
        <street>1 A Street</street>
    </contactInfo>
</customer>

Note the xsi:type attribute on the contactInfo element.


Using Substitution Groups

You can represent inheritance by using the element name with XML schema substitution groups.

In this example, the Java model contains an abstract superclass, ContactInfo for all types of contact information. Address and PhoneNumber are the concrete implementations of ContactInfo.

 
package blog.inheritance;
 
import javax.xml.bind.annotation.XmlRootElement;
 
public abstract class ContactInfo {
 
}
 
@XmlRootElement
public class Address extends ContactInfo {
 
    private String street;
 
    public String getStreet() {
        return street;
    }
 
    public void setStreet(String street) {
        this.street = street;
    }
 
}
 
@XmlRootElement
public class PhoneNumber extends ContactInfo {
 
}

Both Address and PhoneNumber use the @XmlRootElement annotation because the element name is used as the inheritance indicator.


Because the Customer object can have different types of contact information, its property refers to the superclass. The contactInfo property includes the @XmlElementRef annotation to indicate the value type will be derived from the element name (and namespace URI).

 
package blog.inheritance;
 
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;
 
@XmlRootElement
public class Customer {
 
    private ContactInfo contactInfo;
 
    @XmlElementRef
    public ContactInfo getContactInfo() {
        return contactInfo;
    }
 
    public void setContactInfo(ContactInfo contactInfo) {
        this.contactInfo = contactInfo;
    }
 
}

In the following example, the xsi:type attribute represents inheritance.

 
package blog.inheritance;
 
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
 
public class Demo {
 
    public static void main(String[] args) throws Exception {
        Customer customer = new Customer();
        Address address = new Address();
        address.setStreet("1 A Street");
        customer.setContactInfo(address);
 
        JAXBContext jc = JAXBContext.newInstance(Customer.class, Address.class, PhoneNumber.class);
 
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(customer, System.out);
    }
 
}

The above sample code produces the following XML.

<customer>
    <address>
        <street>1 A Street</street>
    </address>
</customer>

Note that the Address object is marshalled to the address element.

Copyright © Eclipse Foundation, Inc. All Rights Reserved.