@XmlTransient
When you mark a field/property with @XmlTransient you are explicitly telling your JAXB implementation to treat it as an unmapped property. This is useful when less than half of the fields/properties are unmapped.
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;
}
Below is what the metadata would look like using MOXy's external mapping document:
<?xml version="1.0" encoding="UTF-8"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="blog.unmapped">
<java-types>
<java-type name="Customer" xml-accessor-type="FIELD">
<java-attributes>
<xml-transient java-attribute="id"/>
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
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. Next I'll demonstrate how we can leverage @XmlAccessorType(XmlAccessType.NONE) for this use case.
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;
@XmlTransient
private Address billingAddress;
@XmlTransient
private Address shippingAddress;
@XmlTransient
private List<PhoneNumber> phoneNumbers;
}
@XmlAccessorType(XmlAccessType.NONE)
By setting @XmlAccessorType(XmlAccessType.NONE) we are disabling configuration by exception. Now only explicitly mapped properties will be mapped. This is useful when less than half of the fields/properties of a domain object are mapped.
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;
}
Below is what the metadata would look like using MOXy's external mapping document:
<?xml version="1.0" encoding="UTF-8"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="blog.unmapped">
<java-types>
<java-type name="Customer" xml-accessor-type="NONE">
<java-attributes>
<xml-element java-attribute="firstName"/>
<xml-element java-attribute="lastName"/>
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
Further Reading
If you enjoyed this post then you also like:
- Using JAXB's @XmlAccessorType to Configure Field or Property Access
- Ignoring Inheritance with @XmlTransient
- Extending JAXB - Representing Metadata as XML
What is the equivalent for the MOXy mapped metadata "binding/oxm.xml" file?
ReplyDeleteI have updated the post to show what the oxm.xml files would look like.
Delete-Blaise
Just what I was looking for !!
ReplyDelete