In previous articles I wrote about how the @XmlTransient annotation can be used at the type level to have a class excluded from the inheritance hierarchy, or at the field/property level to unmap a field/property. In this article I'll demonstrate how doing this impacts the propOrder setting on the @XmlType annotation.
Java Model
Java Model
Base
This class will serve as the root of the inheritance hierarchy. This will be a mapped class, and as such there is nothing special we need to do, to make this happen.
package blog.proporder.xmltransient; public abstract class Base { private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } }
Person
To exclude a class from being mapped as part of the inheritance hierarchy you simply need to annotate it with @XmlTransient. Any super classes of this class that are not annotated with @XmlTransient (i.e. Base) will still be mapped.
To exclude a class from being mapped as part of the inheritance hierarchy you simply need to annotate it with @XmlTransient. Any super classes of this class that are not annotated with @XmlTransient (i.e. Base) will still be mapped.
package blog.proporder.xmltransient; import javax.xml.bind.annotation.XmlTransient; @XmlTransient public class Person extends Base { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
Customer
Since the parent class (Person) has been marked @XmlTransient the name property will be treated as part of the Customer class and can be included in the propOrder. The Customer class also extends Base which was not marked @XmlTransient so the id property can not be specified in the propOrder. The propOrder setting must not include a field/property that has been annotated with @XmlTransient.
Since the parent class (Person) has been marked @XmlTransient the name property will be treated as part of the Customer class and can be included in the propOrder. The Customer class also extends Base which was not marked @XmlTransient so the id property can not be specified in the propOrder. The propOrder setting must not include a field/property that has been annotated with @XmlTransient.
package blog.proporder.xmltransient; import java.util.List; import javax.xml.bind.annotation.*; @XmlRootElement @XmlType(propOrder = { "phoneNumbers", "name"}) public class Customer extends Person { private String password; private List<String> phoneNumbers; @XmlTransient public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @XmlElement(name = "phone-number") public List<String> getPhoneNumbers() { return phoneNumbers; } public void setPhoneNumbers(List<String> phoneNumbers) { this.phoneNumbers = phoneNumbers; } }
Demo Code
Below is the demo code that can be used to run this example:
package blog.proporder.xmltransient; import java.io.File; import javax.xml.bind.*; public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(Customer.class); Unmarshaller unmarshaller = jc.createUnmarshaller(); File xml = new File("input.xml"); Customer customer = (Customer) unmarshaller.unmarshal(xml); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(customer, System.out); } }
XML (input.xml/Output)
Below is the input to, and output from running the demo code. Note how the properties of classes marked with @XmlTransient are included, but properties marked @XmlTransient are not.
<?xml version="1.0" encoding="UTF-8"?> <customer> <id>123</id> <phone-number>555-1111</phone-number> <phone-number>555-2222</phone-number> <name>Jane Doe</name> </customer>
Further Reading
If you enjoyed this post you may also be interested in:
- JAXB and Unmapped Properties
- Mapping Inheritance Using Standard JAXB Mechanisms
- JAXB and Inheritance - Using the xsi:type Attribute
- JAXB and Inheritance - Using Substitution Groups
- JAXB and Inheritance - Using XmlAdapter
- Mapping Inheritance Using MOXy Extensions
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.