2009-02-25 10 views
8

Podczas generowania Java z XSD przez kompilator XJC, zawsze uzyskać typu java.lang.String dla elementów z anonimowych simpleTypes jak ten:JAXB: Anonimowe proste typy jako wyrazy?

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

Oczywiście, chcę wyliczenie dla tego. Czy istnieje sposób na oszukanie XJC do generowania i używania jednego?

Używamy JAXB 2.1.3. Uwaga: zanim zapytasz, nie, nie mogę zmienić schematu i dostosować go do błędów XJC.

Odpowiedz

14

Musisz umieścić w swojej XJC Plik:

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

lub

<jxb:bindings node="//xsd:element[@name='Produkt']"> 
    <jxb:bindings node="./xsd:simpleType"> 
     <jxb:typesafeEnumClass name="ProduktType" /> 
    </jxb:bindings> 
</jxb:bindings> 
1

miałem bardzo podobne pytanie, poprosiłem o liście dyskusyjnej JAXB i dostał this fairly helpful response (nie miałem czasu, aby go wypróbować choć)

edit: jeśli mówisz automatycznie generując się enum class, zamiast automatycznie mapować do klasy enum, którą sam piszesz, myślę, że mógłbyś napisać klasę java, która parsowałaby plik schematu i automatycznie generowała kod java dla tego wyliczenia. (Następnie uruchomić tej klasy java, gdy dzwonisz XJC)

+0

udało mi się to zrobić bez zdefiniowania własny typ enum - zobacz moją odpowiedź. –

+0

Twój link jest uszkodzony. –

+0

naprawiono, dzięki. –

5

Oto przykład, jak ja to realizowane. Dodam cały xjb dla kompletności, ponieważ przyznaję, patrząc na istniejące przykłady, które wciąż uważam za nieco mylące.

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

Tutaj powiązania odnoszą się do moich typów prostych, które są zadeklarowane na poziomie głównym moim search-constraints.xsd. Oto fragment tego pliku:

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

Powiązane problemy