2010-11-25 3 views
5

У меня есть следующая ситуация:JAXB xsd: включить и отдельные пакеты

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

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

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

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

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

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

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions The element name {http://www.example.org/Scenario/}scenario has more than one mapping

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

ответ

6

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

Таким образом, мое основное предположение было бы использовать xsd:import и рассмотреть подход separate schema compilation.

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

+0

Спасибо за ответ. Я уже изменил его, чтобы использовать импорт вместо include, действительно, кажется, лучше. Я взгляну на сообщение в блоге, кажется многообещающим до сих пор. – Alexander 2010-11-25 13:49:34