JAXB — создание классов из XSD — преобразование перечислений в строки

Используя JAXB, мы напрямую генерируем наши Java-бины. В XSD у нас есть перечисляемый тип:

  <xs:simpleType name="promptBeforeCloseType">
    <xs:restriction base="xs:string">
     <xs:enumeration value="default"/>
     <xs:enumeration value="always"/>
     <xs:enumeration value="never"/>
    </xs:restriction>
  </xs:simpleType>

JAXB генерирует перечисляемый тип для поля, использующего этот тип. Мы хотели бы преобразовать его в String в сгенерированном классе Java, потому что эти классы сопоставляются с классами ActionScript, а в ActionScript нет перечисляемого типа.

Есть ли способ сделать это, реализуя какой-то конвертер? Может быть с XmlJavaTypeAdapter?


person nicoulaj    schedule 05.11.2009    source источник
comment
Вы всегда можете использовать методы toString или name перечисления, верно? :-)   -  person Chris Jester-Young    schedule 05.11.2009
comment
Сгенерированные классы должны иметь поле типа String, а не Enum, во всех остальных случаях сопоставление с соответствующим классом ActionScript завершается ошибкой.   -  person nicoulaj    schedule 05.11.2009


Ответы (3)


Вы можете заставить XJC не генерировать перечисления. См. раздел «Объявления глобальных привязок» этого документа:

Если для typesafeEnumBase задано значение xsd:string, это будет глобальный способ указать, что все определения простых типов, прямо или косвенно производные от xsd:string и имеющие фасеты перечисления, должны быть привязаны по умолчанию к безопасному для типов перечислению. Если для typesafeEnumBase задана пустая строка, "", ни одно определение простого типа никогда не будет привязано к классу безопасного перечисления по умолчанию.

person skaffman    schedule 06.11.2009
comment
обновленное местоположение документа: download.oracle.com/javaee/5/ учебник/doc/bnbbf.html#bnbcd - person end-user; 27.01.2011
comment
Это все еще в силе? Поскольку я устанавливаю typesafeEnumBase в пустую строку "" и получаю ошибки (stackoverflow.com/questions/46927872/) - person pleft; 25.10.2017

Ознакомьтесь с разделом [Переопределение типа данных] [1] руководства по JAXB. Вы можете сделать это с помощью настроенного файла привязок, аналогичного примеру в нижней части страницы.

Я думаю, вам придется написать свой собственный метод преобразования (и, следовательно, класс), к сожалению, поскольку, похоже, нет встроенного (вероятно, из-за того, что перечисления, сгенерированные JAXB, не имеют общего суперкласса). Но все, что вам нужно сделать, это вызвать метод value() для вашего объекта enum, который вернет строку, сопоставленную с ним.

[1]: https://jaxb.dev.java.net/tutorial/section_5_6_1-Overriding-the-Datatype.html#Overriding типа данных

person Andrzej Doyle    schedule 05.11.2009

jaxb:globalBindings typesafeEnumBase="xs:boolean" будет работать - если оставить его пустым, как предлагается, это недопустимо для схемы привязки.

person Dean    schedule 02.05.2013