Привязка JAXB — как определить DomHandler для использования в @XmlAnyElement

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

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

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

StreamHandler implements DomHandler<MyStream, StreamResult>

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

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

@XmlAnyElement(StreamHandler.class)

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

Изменить:

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


person user498380    schedule 14.03.2012    source источник


Ответы (1)


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

На самом деле вы хотите, чтобы 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>
person lexicore    schedule 15.03.2012
comment
Спасибо за ваш ответ. Проблема с вашим предложением заключается в том, что использование StreamHandler реализует DomHandler‹T1, T2› также потребует изменения типа свойства. Тип свойства any теперь будет T1. Сигнатуры методов получения и установки также должны быть скорректированы, и плагин аннотаций не может выполнять эту работу. - person user498380; 15.03.2012