Я использую JAXB для чтения и записи XML. Я хочу использовать базовый класс JAXB для сортировки и унаследованный класс JAXB для unmarshalling. Это позволяет Java-приложению отправителя отправлять XML в другое приложение Java-приемника. Отправитель и получатель будут иметь общую библиотеку JAXB. Я хочу, чтобы ретранслятор отменил XML-код на конкретный JAXB-приемник, который расширяет общий класс 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);
То, что я хочу, чтобы маршализацию к ReceiverPerson
. Единственный способ, которым я смог это сделать, - удалить @XmlRootElement
с Person
. К сожалению, это предотвращает марксирование Person
. Это похоже на то, что JAXB начинается с базового класса и работает до тех пор, пока не найдет первый @XmlRootElement
с соответствующим именем. Я попытался добавить метод createPerson()
, который возвращает ReceiverPerson
в ObjectFactory
, но это не поможет.
Я пробовал это, и он не работает. Независимо от того, что я пытаюсь, ObjectFactory или мой XmlAdapter никогда не вызываются. Из того, что я прочитал, JAXB от Sun решает статические ссылки на классы. Похоже, реализация Glassfish имеет больше шансов https://jaxb.dev.java.net/guide/Adding_behaviors.html –
XmlJavaAdapters подходят для создания классов, не связанных с JAXB, которые можно использовать с JAXB. Поскольку Person и ReceiverPerson (и/или их надкласс, если они есть) имеют аннотации JAXB, это не работает. Вам нужен Person и ReceiverPerson без JAXB, плюс адаптеры для обоих. –
Вы пробовали подкачки для marshall | unmarshall? [...] расширяет XmlAdapter [...] @Override public ReceiverPerson unmarshal (Person v) { return new ReceiverPerson (v); } @Override публичный маршал лица (ReceiverPerson v) { return v; } –