13 Stimmen

JAXB: Anonyme einfache Typen als Enums?

Wenn ich mit dem XJC-Compiler Java aus einer XSD generiere, erhalte ich immer den Typ java.lang.String für Elemente mit anonymen simpleTypes wie diesem:

    <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 möchte ich dafür eine Aufzählung haben. Gibt es eine Möglichkeit, XJC auszutricksen, damit es eine generiert und verwendet?

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

19voto

Hans-Peter Störr Punkte 24030

Sie müssen sie in Ihre XJC-Datei eingeben:

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

5voto

Kristofer Punkte 6293

Hier ist ein Beispiel dafür, wie ich dies umgesetzt habe. Ich werde der Vollständigkeit halber die gesamte xjb hinzufügen, da ich zugeben muss, dass ich es beim Betrachten bestehender Beispiele immer noch ein wenig verwirrend fand.

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

Hier beziehen sich die Bindungen auf meine einfachen Typen, die auf Root-Ebene in meiner search-constraints.xsd deklariert sind. 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>

1voto

Jason S Punkte 178087

Ich hatte eine sehr ähnliche Frage, ich fragte auf der JAXB-Mailingliste und erhielt diese recht hilfreiche Antwort (hatte allerdings noch keine Zeit, es auszuprobieren)

edit: wenn Sie über automatisch erzeugend die Enum-Klasse, anstatt nur automatisch auf eine Enum-Klasse, die Sie selbst schreiben, abzubilden, würde ich denken, dass Sie eine Java-Klasse schreiben könnten, die die Schemadatei analysiert und den Java-Code für diese Enumeration automatisch generiert. (und dann diese Java-Klasse bei jedem Aufruf von xjc ausführen)

0 Stimmen

Ich habe es geschafft, dies zu tun, ohne meinen eigenen Enum-Typ zu definieren - siehe meine Antwort.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X