August 11, 2012

JAXB's @XmlTransient and Property Order

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


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) { = id;



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;

public class Person extends Base {

    private String name;

    public String getName() {
        return name;

    public void setName(String name) { = name;



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.*;

@XmlType(propOrder = { "phoneNumbers", "name"})
public class Customer extends Person {

    private String password;
    private List<String> phoneNumbers;

    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 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"?>
   <name>Jane Doe</name>

Further Reading

If you enjoyed this post you may also be interested in:

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.