2009-02-25 4 views
8

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

<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.

ответ

14

Вы должны поставить в ваш 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> 
1

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

редактирования: если вы говорите о автоматической генерации в enum class, а не просто автоматически сопоставлять класс enum, который вы пишете сами, я бы подумал, что вы можете написать класс java, который будет анализировать файл схемы и автогенерировать код java для этого перечисления. (А затем запустить этот класс Java всякий раз, когда вы звоните XJC)

+0

мне удалось сделать это без определения собственного типа перечисления - см моего ответа. –

+0

Ваша ссылка не работает. –

+0

исправил его, спасибо. –

5

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

Here's .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> 

Здесь привязки сослаться на мои простые типы, которые объявлены на уровне корня в моем поиске 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>