2009-02-25 10 views
8

Wenn Java von einem XSD über den Compiler XJC zu erzeugen, habe ich den Typ java.lang.String für Elemente mit anonymen Simple wie dies immer erhalten:JAXB: Anonyme einfache Typen wie Enums?

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

Natürlich habe ich für diese eine Aufzählung soll. Gibt es eine Möglichkeit, XJC dazu zu bringen, einen zu generieren und zu benutzen?

Wir verwenden JAXB 2.1.3. Hinweis: Bevor Sie fragen, nein, kann ich das Schema nicht ändern und es an die Fehler von XJC anpassen.

bearbeiten

Antwort

14

Sie haben in Ihre XJC Datei setzen:

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

oder

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

hatte ich eine sehr ähnliche Frage, ich auf der JAXB Mailing-Liste gefragt und bekam this fairly helpful response (obwohl haben sie keine Zeit gehabt, zu versuchen): Wenn Sie sprechen automatische Generierung von die Enum-Klasse, anstatt nur automatisch auf eine Enum-Klasse zu mappen, die Sie selbst schreiben, würde ich denken, dass Sie eine Java-Klasse schreiben könnten, die die Schemadatei syntaktisch analysiert und den Java-Code für diese Enumeration automatisch generiert. (Dann die Java-Klasse ausgeführt, wenn Sie xjc nennen)

+0

ich es geschaffen, dies zu tun, ohne meinen eigenen Aufzählungstyp zu definieren - meine Antwort sehen. –

+0

Ihr Link ist kaputt. –

+0

reparierte es, danke. –

5

Hier ist ein Beispiel dafür, wie ich dies umgesetzt. Ich werde das ganze xjb der Vollständigkeit halber hinzufügen, da ich zugeben muss, dass existierende Beispiele noch ein wenig verwirrend sind.

Heres die .xjb Datei

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

Dabei beziehen sich die Bindungen an meine einfachen Typen, die in meiner Suche-constraints.xsd auf Root-Ebene deklariert werden. Hier ist ein Auszug aus dieser Datei:

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