I’m using JAXB to read and write XML. What I want is to use a base JAXB class for marshalling and an inherited JAXB class for unmarshalling. This is to allow a sender Java application to send XML to another receiver Java application. The sender and receiver will share a common JAXB library. I want the receiver to unmarshall the XML into a receiver specific JAXB class which extends the generic JAXB class.
Example:
This is the common JAXB class which is used by the sender.
@XmlRootElement(name='person') public class Person { public String name; public int age; }
This is the receiver specific JAXB class used when unmarshalling the XML. The receiver class has logic specific to the receiver application.
@XmlRootElement(name='person') public class ReceiverPerson extends Person { public doReceiverSpecificStuff() ... }
Marshalling works as expected. The problem is with unmarshalling, it still unmarshals to Person despite the JAXBContext using the package name of the subclassed ReceiverPerson.
JAXBContext jaxbContext = JAXBContext.newInstance(package name of ReceiverPerson);
What I want is to unmarshall to ReceiverPerson. The only way I’ve been able to do this is to remove @XmlRootElement from Person. Unfortunately doing this prevents Person from being marshaled. It’s as if JAXB starts at the base class and works its way down until it finds the first @XmlRootElement with the appropriate name. I’ve tried adding a createPerson() method which returns ReceiverPerson to ObjectFactory but that doesn’t help.
You’re using JAXB 2.0 right? (since JDK6)
There is a class:
which one can subclass, and override following methods:
Example:
Usage is done by as following:
I’m pretty sure, by using this concept you can control the marshalling/unmarshalling process by yourself (including the choice the correct [sub|super]type to construct).