Я использую JAXB для чтения и записи XML. Я хочу использовать базовый класс JAXB для маршалинга и унаследованный класс JAXB для демаршаллинга. Это позволяет отправляющему Java-приложению отправлять XML другому получающему Java-приложению. Отправитель и получатель будут использовать общую библиотеку JAXB. Я хочу, чтобы получатель аннулировал XML в специальный класс JAXB получателя, который расширяет общий класс JAXB.
Пример:
Это общий класс JAXB, который используется отправителем.
@XmlRootElement(name="person")
public class Person {
public String name;
public int age;
}
Это специфичный для получателя класс JAXB, используемый при демаршаллинге XML. Класс получателя имеет логику, специфичную для приложения получателя.
@XmlRootElement(name="person")
public class ReceiverPerson extends Person {
public doReceiverSpecificStuff() ...
}
Маршаллинг работает как положено. Проблема с демаршалингом, он все еще демаршализируется до Person
несмотря на то, что JAXBContext использует имя пакета для подкласса ReceiverPerson
.
JAXBContext jaxbContext = JAXBContext.newInstance(package name of ReceiverPerson);
Чего я хочу, так это разобраться с ReceiverPerson
. Единственный способ сделать это - удалить @XmlRootElement
из Person
. К сожалению, это не позволяет маршалировать Person
. Это как если бы JAXB начинал с базового класса и продолжал свой путь вниз, пока не нашел первый @XmlRootElement
с соответствующим именем. Я попытался добавить метод createPerson()
, который возвращает ReceiverPerson
в ObjectFactory
, но это не помогает.