JAXB xsd: включить и отделить пакеты - PullRequest
5 голосов
/ 25 ноября 2010

У меня следующая ситуация:

Есть 2 файла xsd. Первый определяет корневой элемент и несколько типов.

Второй включает в себя первый и расширяет один из типов. Там в этом файле не определен корневой тип.

Начиная с первого xsd, модель генерируется в пакете (a). Вторая схема должна создать новый пакет (б) для дополнительного типы, но повторно использовать сгенерированный пакет a. Я решил это с помощью файл привязки, который указывает на ранее созданные элементы (в пакет а). Пока это работает, но ..

JAXB генерирует ObjectFactory в пакете A, который содержит создание метод для корневого элемента. Для второй схемы также создается ObjectFactory в пакете B. И у этого класса также был метод create для того же корневого элемента.

Чтобы иметь возможность использовать все типы, контекст jaxb создается с использованием несколько объектных фабрик (newInstance(a.ObjectFactory.class, b.ObjectFactory.class)).

Во время выполнения это приводит к следующей ошибке:

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 подсчет IllegalAnnotationExceptions Имя элемента {http://www.example.org/Scenario/}scenario имеет больше чем одно отображение

Должен ли я генерировать пакеты по-другому? Или есть что-то возможно использование файла привязки для предотвращения фабрики объектов от иметь дубликаты методов?

1 Ответ

6 голосов
/ 25 ноября 2010

Прежде всего, важно понимать, что если вы используете xsd:include вместо xsd:import, у вас нет двух разных схем.Это одна схема в нескольких файлах, и ее компиляция в нескольких пакетах и ​​обман JAXB для объединения этих пакетов выглядит скорее как хакерство.

Поэтому мое основное предложение было бы использовать вместо xsd:import и рассмотреть отдельную компиляцию схемы подход.

Если вы хотите остаться с xsd:include, вам придется обмануть JAXB.Например, вы можете удалить или настроить один (или оба) из классов ObjectFactory и построить свой контекст JAXB на основе отдельных классов, а не объектных фабрик.Вы также можете использовать jaxb.index вместо объектных фабрик.Но это все взлом.

...