XML-адаптеры JAXB не используются с типом аннотации XmlElements - PullRequest
0 голосов
/ 09 января 2019

У меня есть класс A, с подклассами B и C. Кроме того, я использую аннотацию XmlJavaTypeAdapters в файле package-info.java. В нем я указываю адаптеры для B и C

@XmlJavaTypeAdapters({
    @XmlJavaTypeAdapter(value = BAdapter.class, type = B.class),
    @XmlJavaTypeAdapter(value = CAdapter.class, type = C.class)
})
package xyz;

В классе в пакете xyz, который должен быть сериализован с JAXB, я пишу это:

@XmlElementWrapper(name = "entries")
@XmlElements({ @XmlElement(name = "b-entry", type = B.class),
               @XmlElement(name = "c-entry", type = C.class) })
private List<A> entries = new ArrayList<>();

Эта конструкция в целом всегда работает, когда не требуются адаптеры XML. Однако теперь кажется, что JAXB не использует определенные адаптеры XML для типов @XmlElement. Он пытается сериализовать «b-entry» и «c-entry» без адаптеров, что не удается.
У меня есть много других XmlAdapters на уровне пакета, все они работают, если вы не используете их с @ XmlElements.

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

1 Ответ

0 голосов
/ 09 января 2019

Оказывается, действительно невозможно использовать @XmlElements вместе с адаптерами XML уровня пакета или, возможно, любым адаптером XML.

Я обошел эту проблему, создав List<B>, а также List<C>, а затем в коде, объединяя их в List<A>.

Что наиболее важно, однако, для адаптеров XML для работы с элементами списка: Вам не разрешено указывать атрибут type для @XmlElement. Оставьте это, и адаптер XML будет работать. Это означает, что аргумент типа List должен быть точным типом, для которого у вас есть адаптер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...