JAXB: анонимные простые типы как перечисления? - PullRequest
10 голосов
/ 25 февраля 2009

При генерации Java из XSD с помощью компилятора XJC я всегда получаю тип java.lang.String для элементов с анонимными simpleTypes, например:

    <xsd:element name="Product">
    <xsd:simpleType>
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="Product1"/>
            <xsd:enumeration value="Product2"/>
            <xsd:enumeration value="Product3"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:element>

Конечно, я хочу перечисление для этого. Есть ли способ заставить XJC генерировать и использовать один?

Мы используем JAXB 2.1.3. Примечание: прежде чем вы спросите, нет, я не могу изменить схему и адаптировать ее к ошибкам XJC.

Ответы [ 3 ]

15 голосов
/ 20 марта 2009

Вы должны поместить в свой файл XJC:

<jxb:bindings node="//xsd:element[@name='Product']/xsd:simpleType">
    <jxb:typesafeEnumClass name="ProductType" />
</jxb:bindings>

или

<jxb:bindings node="//xsd:element[@name='Produkt']">
    <jxb:bindings node="./xsd:simpleType">
        <jxb:typesafeEnumClass name="ProduktType" />
    </jxb:bindings>
</jxb:bindings>
5 голосов
/ 27 января 2010

Вот пример того, как я это реализовал. Я добавлю весь xjb для полноты, поскольку я допускаю, что, глядя на существующие примеры, я все еще находил это немного запутанным.

Вот файл .xjb

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               jaxb:version="1.0">
   <jaxb:bindings schemaLocation="search-constraints.xsd" 
    node="/xs:schema">

     <jaxb:bindings node="//xs:simpleType[@name='booleanStringType']">
      <jaxb:typesafeEnumClass name="BooleanStringType" />
  </jaxb:bindings>

   </jaxb:bindings>
</jaxb:bindings>

Здесь привязки относятся к моим простым типам, которые объявлены на корневом уровне в моем search-constraints.xsd. Вот выдержка из этого файла:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
 targetNamespace="http://www.example.com" 
 xmlns:tns="http://www.example.com" 
 elementFormDefault="qualified"
 xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    jaxb:version="1.0">

...


<xs:simpleType name="booleanStringType">
    <xs:restriction base="xs:string">
        <xs:enumeration value="true" />
        <xs:enumeration value="false" />
    </xs:restriction>
</xs:simpleType>

1 голос
/ 25 февраля 2009

У меня был очень похожий вопрос, я задал его в списке рассылки JAXB и получил этот довольно полезный ответ (хотя я не успел его опробовать)

edit: если вы говорите о автоматическом генерировании класса enum, а не просто о автоматическом сопоставлении с классом enum, который вы пишете сами, я думаю, вы могли бы написать класс java, который бы анализировал файл схемы и автоматически создать код Java для этого перечисления. (затем запускайте этот Java-класс всякий раз, когда вы вызываете xjc)

...