2015-04-16 2 views
1

У нас есть следующая проблема. Мы пытаемся сгенерировать Java-код из XSD-файлов, содержащих декларации групп и несколько ссылок на группы для этих групповых объявлений. Вот упрощенная версия:Как влиять на формирование классов деклараций групп с помощью XJC

<xs:group name="Information"> 
    <xs:sequence> 
    <xs:element name="Name"> 
     <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
      <xs:attribute name="updated" type="xs:boolean"/> 
      </xs:extension> 
     </xs:simpleContent> 
     </xs:complexType> 
    </xs:element> 
</xs:sequence> 
</xs:group> 

<xs:element name="Address"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:group ref="Information" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:element name="Customer"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:group ref="Information"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Основные моменты:

  • Каждый из этих элементов определяется в отдельном файле
  • Та же группа Information это ссылки дважды
  • Там нет отдельного тип для группы
  • Также нет отдельного типа для элемента Name внутри группы
  • Мы не можем изменить файл XSD

Проблема мы сталкиваемся в настоящее время является то, что XJC генерирует недетерминированно в зависимости от машины, на которой мы строим, иногда типа Address.Name и иногда типа Customer.Name, потому что Name элемента является сложным типом и требует типа.

Есть ли способ сказать xjc всегда генерировать один и тот же тип?

ответ

1
  • Настроить анонимный комплексный тип с привязкой jaxb:class и указать имя класса.
  • Используйте <jaxb:globalBindings localScoping="toplevel"/> для создания внутренних классов на верхнем уровне.

Комбинация этих двух даст вам предсказуемый класс.

+0

Спасибо, что сделал! Использование localScoping = "toplevel" сразу же решило проблему. Однако у других типов были конфликты, которые я тогда мог решить, используя привязки классов. –

0

Вы можете попробовать -episodecommand line option of XJC. Это прежде всего предназначено для компиляции в несколько этапов, но я думаю, что это в основном «принимает решения», принятые XJC во время компиляции в файл привязки (привязки). Если вам повезет, вы найдете подходящие настройки, связанные с элементом/типом Name в файле эпизода, который вы можете скопировать в свой файл конфигурации привязки, чтобы заставить XJC вести себя детерминистически.

+0

Интересно! Однако сгенерированный файл не содержал тип Name. –