2012-02-20 2 views
3

Я пытаюсь сгенерировать java-файлы из XML-схемы с помощью JAXB. Одним из типов данных в схеме является строка с примерно 300 возможными значениями. Так как это больше, чем 256, xjc по умолчанию не генерирует перечисление для этого типа, но вместо этого использует строку. Так как я хочу иметь перечисление генерироваться, я создаю bindings.xml со следующим содержанием:JAXB: globalBindings в bindings.xml игнорируется

 
<bindings version="2.0" xmlns="http://java.sun.com/xml/ns/jaxb"> 
    <globalBindings typesafeEnumMaxMembers="1000" /> 
</bindings>

Это не работает по неизвестной причине. xjc не дает мне подсказки. Сначала я подумал, что у меня нет файла, поэтому я проверил. Я также попытался умышленно неправильно использовать имя элемента, например globalBindings, до globalBinding и обнаружил, что xjc жаловался на недопустимый элемент, что, очевидно, означает, что xjc считывает файл привязки.

Однако, когда я помещаю globalBindings внутри xsd, он отлично работает - генерируется enum.

 
<xs:schema ....> 
    <xs:annotation> 
    <xs:appinfo> 
     <jaxb:globalBindings typesafeEnumMaxMembers="1000" /> 
    </xs:appinfo> 
    </xs:annotation> 
... 
... 
</xs:schema > 

Так что мой вопрос как же опция установлена ​​в bingings.xml (который читается XJC) не используется для настройки компиляции? Что мне здесь не хватает?

Большое спасибо за любую помощь.

ответ

0

вам нужно использовать xjb файл не и XML один

+0

Ваш ответ может быть усилен путем добавления некоторых ссылок и/или примеров. – mathielo

0

Я думаю, что вы должны добавить JAXB аннотацию перед вашими тегами, как это:

<jaxb:bindings 
     xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
     jaxb:extensionBindingPrefixes="xjc" 
     jaxb:version="1.0"> 
     <jaxb:globalBindings typesafeEnumMaxMembers="2000"> 
     </jaxb:globalBindings> 
    </jaxb:bindings> 
+0

Хм, почему? В чем разница между использованием «xmlns = ...» и «xmlns: jaxb = ...» в том, что глобальные привязки действительно глобальны? – NestorDRod

3

я понял, что длина текущего каталога вызывает xjc игнорировать конфигурацию привязки.

Выполнение следующей команды выходит из строя или успехов (связанных со связыванием) в зависимости от базового каталога проекта:

xjc -extension src/main/resources/schema/schema.xsd -b src/main/resources/schema/bindings.xjb -d target/tmp 

Так короче каталог проекта является более вероятным, что будет успех:

FAILS: C:/anydir/tstaaaaaaaaaaaaaaaa/asubdirectory/_this_is_any_project_directory_ 
FAILS: C:/anydir/tstaaaaaaaa/asubdirectory/_this_is_any_project_directory_ 
FAILS: C:/anydir/tstaaa/asubdirectory/_this_is_any_project_directory_ 
FAILS: C:/anydir/tstaa/asubdirectory/_this_is_any_project_directory_ 
WORKS: C:/anydir/tsta/asubdirectory/_this_is_any_project_directory_ 
WORKS: C:/anydir/tst/asubdirectory/_this_is_any_project_directory_ 

Мои коллеги, работающие с подобной средой (также Windows, те же JDK, те же источники проекта) не имеют такого строгого ограничения длины. Так что я понятия не имею, что вызывает это ограничение. Но после того, как я разместил свои источники проекта рядом с корневым каталогом, он работал для меня.

+0

То же самое для меня! Я потратил больше дня на то, чтобы решить эту проблему! Он должен быть принят как ответ – Dennis

0

Я подтверждаю ответ Ахима Тромма, длина текущего базового каталога заставляет xjc игнорировать конфигурацию привязки. Сокращение пути к папке происходит успешно. Это ошибка JAXB !?

Смежные вопросы