JAXB маршалинг заявленного родительского класса по сравнению с фактическим подклассом во время выполнения

Я использую JAXB для маршалинга класса, который имеет переменную экземпляра, которой это объявляется как класс Foo. Во времени выполнения, что переменная экземпляра установлена на экземпляр подкласса Foo, скажем, FooBar. Существуют основные аннотации JAXB и на класс Foo и на FooBar.

XML производят шоу, что экземпляр Foo упорядочивается вместо FooBar. Действительно ли там что-то конкретно, я должен сделать с точки зрения аннотаций для сообщения JAXB, как правильно упорядочить подкласс во время выполнения вместо заявленного суперкласса?

Я попробовал эксперимент, в котором я непосредственно упорядочил нечто переменной экземпляра типа Foo, который был установлен на экземпляр FooBar во времени выполнения. Это правильно упорядочило экземпляр FooBar.

Это явно отличается от маршалинга класса, который содержит переменную экземпляра типа Foo, потому что вызов маршала выполняется на содержании класса, и JAXB просто упорядочивает это поля классов (я использую @XmlAccessorType (XmlAccessType. ПОЛЕ) аннотация).

Мое ожидание состояло в том, что JAXB мог правильно осмотреть тип выполнения переменной экземпляра, но возможно это не имеет место. Эта ситуация призывает к использованию реализации XmlAdapter, как описано здесь?

Наследование JAXB, немаршал к подклассу упорядоченного класса

Спасибо,

Chris

5
задан Community 23 May 2017 в 10:27
поделиться

1 ответ

Я использую эти классы в качестве примера:

@XmlRootElement
class Foo { public Bar bar; }
class Bar {}
class Baz extends Bar {}
class Quux extends Bar {}

Кажется, есть два возможных решения:

Вы можете сообщить JAXB обо всех задействованных классах (включая подклассы) во время создания контекста.

JAXBContext.newInstance(Foo.class, Bar.class, Baz.class, Quux.class);

Вы сообщаете JAXB о других классах через аннотацию @XmlSeeAlso .

@XmlRootElement
@XmlSeeAlso({Baz.class, Quux.class})
class Foo { public Bar bar; }

Если вы выполните такой маршал

Foo f = new Foo();
f.bar = new Baz();

m.marshal(f, System.err);

, вы получите

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<foo>
    <bar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="baz"/>
</foo>

Это некрасиво, но информация о типе сохраняется.

7
ответ дан 14 December 2019 в 08:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: