JAXB's @XmlTransient and Property Order
Join the DZone community and get the full member experience.
Join For FreeJava Model
package blog.proporder.xmltransient;
public abstract class Base {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.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;
@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.
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;
}
}
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);
}
}
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>
Published at DZone with permission of Blaise Doughan. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments