Я использую JAXB для чтения и записи XML. Я хочу использовать базовый класс JAXB для сортировки и унаследованный класс JAXB для unmarshalling. Это позволяет 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() ...
}
Маршаллинг работает так, как ожидалось. Проблема заключается в том, что он unmarshalling, но по-прежнему не привязан к Person
, несмотря на JAXBContext, используя имя пакета подкласса ReceiverPerson
.
JAXBContext jaxbContext = JAXBContext.newInstance(package name of ReceiverPerson);
Я хочу, чтобы unmarshall на ReceiverPerson
. Единственный способ, которым я смог это сделать, - удалить @XmlRootElement
из Person
. К сожалению, это предотвращает марксирование Person
. Как будто JAXB начинается с базового класса и работает до тех пор, пока не найдет первый @XmlRootElement
с соответствующим именем. Я попытался добавить метод createPerson()
, который возвращает ReceiverPerson
в ObjectFactory
, но это не помогает.