JAXB (JSR-222) is configuration by exception, meaning that there is a default mapping applied to domain objects. This means that sometimes you need to explicitly exclude a field/property. In this post I’ll discuss how this can be done using @XmlTransient or @XmlAccessorType(XmlAccessType.NONE) and when each option is appropriate.
@XmlTransient
package blog.unmapped; import java.util.List; import javax.xml.bind.annotation.*; @XmlAccessorType(XmlAccessType.FIELD) public class Customer { @XmlTransient private int id; private String firstName; private String lastName; private Address billingAddress; private Address shippingAddress; private List<PhoneNumber> phoneNumbers;
The resultant XML will not have the “id” field inside it.
If more than half of the fields/properties are unmapped then we stop gaining the benefit of configuration by exception since we need to do more work to exclude properties with @XmlTransient than we would have had to do to map the mapped properties.
To Resolve this problem, JAXB comes with a new flavor of annotation –
@XmlAccessorType(XmlAccessType.NONE)
package blog.unmapped; import java.util.List; import javax.xml.bind.annotation.*; @XmlAccessorType(XmlAccessType.NONE) public class Customer { private int id; @XmlElement private String firstName; @XmlElement private String lastName; private Address billingAddress; private Address shippingAddress; private List<PhoneNumber> phoneNumbers; }
The resultant XML file will not have those elements which are not explicitly mapped using the @XmlElement annotation.