Связывание JAXB - Как определить DomHandler для использования в @XmlAnyElement - PullRequest
0 голосов
/ 14 марта 2012

Я искал способ изменить поведение JAXB для xs: любые элементы, потому что мы используем поток вместо DOM. Нам нужно уметь обрабатывать огромные (гигабайты) файлы / потоки данных.

JAXB сгенерирует любые свойства, используя для них аннотацию @XmlAnyElement. Поскольку мы используем нашу собственную потоковую реализацию, нам нужно вообще избегать генерации JAXB свойства any-свойства. Однако, как кажется, невозможно заставить привязку JAXB игнорировать xs: любые элементы.

В моем текущем исследовании этой темы я выяснил, что можно написать DomHandler, который будет использоваться. Теперь, если этот DomHandler будет выглядеть так:

StreamHandler implements DomHandler<MyStream, StreamResult>

мы могли бы использовать этот DomHandler для выполнения работы без необходимости добавлять логику потока рядом с нашими сгенерированными классами. Теперь мы можем просто использовать сгенерированное свойство any-свойство для этого.

DomHandler должен быть установлен следующим образом

@XmlAnyElement(StreamHandler.class)

Но как я могу определить в xax-файле привязки jaxb использование этого DomHandler в сгенерированных аннотациях @XmlAnyElement?

Edit:

Я подал этот запрос и внедрил аддон maven-plugin JAXB для решения этой проблемы. Я могу попросить добавить это дополнение в пакет basics-addon.

1 Ответ

0 голосов
/ 15 марта 2012

Я не уверен, что это действительно правильный подход для решения вашей проблемы.

Что вам действительно нужно, так это заставить XJC "игнорировать" некоторые свойства при связывании.Я не думаю, что это возможно в данный момент, но это может быть решено с помощью плагина JAXB.Пожалуйста, подайте запрос .

Теперь вернемся к вашему подходу и вашему вопросу.Не существует «нативной» настройки для настройки обработчика DOM для @XmlAnyElement, но вы можете использовать плагин Annotate для добавления / изменения произвольных аннотаций в сгенерированных вами классах.Вот тестовый проект, который демонстрирует эту функциональность:

https://svn.java.net/svn/jaxb2-commons~svn/basics/trunk/tests/annotate/

Т.е. эта настройка добавляет required = true к сгенерированной аннотации @XmlAttribute:

<jaxb:bindings node="xs:complexType[@name='issueJIIB39CType']/xs:attribute[@name='test']">
    <annox:annotate target="field">
        <annox:annotate
            annox:class="javax.xml.bind.annotation.XmlAttribute"
            required="false"/>
    </annox:annotate>
</jaxb:bindings>

Вы можете сделать то же самое с @XmlAnyElement, что-то вроде:

<jaxb:bindings node="...">
    <annox:annotate target="field">
        <annox:annotate
            annox:class="javax.xml.bind.annotation.XmlAnyElement"
            value="com.acme.foo.StreamHandler"/>
    </annox:annotate>
</jaxb:bindings>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...