2012-04-05 18 views
2

Ich habe ein Problem mit dem XJC-Tool, dass es keine Enum-Klasse für das Attribut myEnum mit diesem Schema generiert.Bindung - JAXB: XJC Generiert keine Enum-Klasse für ein Attribut

<xs:element name="myClass"> 
<xs:complexType> 
    <xs:attribute name="myEnum" > 
      <xs:simpleType > 
       <xs:restriction base="xs:string"> 
        <xs:maxLength value="1"/> 
        <xs:enumeration value="C"/> 
        <xs:enumeration value="M"/> 
        <xs:enumeration value="S"/> 
       </xs:restriction> 
      </xs:simpleType> 
    </xs:attribute> 
</xs:complexType> 
</xs:element> 

aber es erzeugt es, wenn ich diese verwenden nur

<xs:simpleType > 
<xs:restriction base="xs:string"> 
    <xs:maxLength value="1"/> 
    <xs:enumeration value="C"/> 
    <xs:enumeration value="M"/> 
    <xs:enumeration value="S"/> 
</xs:restriction> 
</xs:simpleType> 

hier ist die externe Bindung Dateiinhalt:

<?xml version="1.0" encoding="UTF-8" ?> 
<bindings xmlns="http://java.sun.com/xml/ns/jaxb" 
    version="2.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    > 
<globalBindings typesafeEnumMemberName="generateName"> 

</globalBindings> 
</bindings> 

Antwort

2

du versuchen könnte: mit nur einer kleinen XSD-Datei definieren Dieser bestimmte Typ wird als globaler Typ deklariert, z. B .:

<xs:simpleType name="myEnumSimpleType"> 
    <xs:restriction base="xs:string"> 
     <xs:maxLength value="1"/> 
     <xs:enumeration value="C"/> 
     <xs:enumeration value="M"/> 
     <xs:enumeration value="S"/> 
    </xs:restriction> 
</xs:simpleType> 

<xs:element name="myClass"> 
    <xs:complexType> 
     <xs:attribute name="myEnum" type="myEnumSimpleType"> 
    </xs:complexType> 
</xs:element> 

Das wird eine JAXB-Klasse erzeugen (nennen wir es die künstliche JAXB-Klasse).

Dann können Sie xjc auf der größeren XSD ausführen und die Generierung anpassen, um diesen Typ für die einzelnen Elemente zu verwenden.

Wenn die JAXB-Generierung von dieser externen XSD alternativ eine einmalige Operation ist (und Sie dann beispielsweise den JAXB-generierten Code in Ihre SVN/Git einfügen), können Sie diesen Teil des zu verwendenden Codes neu schreiben Ihr "künstlicher" JAXB-Typ stattdessen.

Eine weitere Sie versuchen wünschen können ist Ihre verbindliche Anpassung

<globalBindings typesafeEnumMemberName="generateName"> 

kein global sein zu haben, aber verwenden Ausdruck, es zu versuchen genau auf diese Art zu nageln. Es ist wahrscheinlich, dass JAXB für jedes Vorkommen eine neue Klasse generiert, auch wenn sie identisch sein wird.

Da ich XPath langweilig finde, würde ich es schnell auf einer lokalen Kopie dieser großen XSD testen, die Sie mit dem Namespace, z.

<xs:element name="myClass"> 
    <xs:complexType> 
    <xs:attribute name="myEnum" > 
     <xs:simpleType > 
       <xs:annotation> 
        <xs:appinfo> 
         <jaxb:typesafeEnumClass/> 
        </xs:appinfo> 
       </xs:annotation>    <xs:restriction base="xs:string"> 
       <xs:maxLength value="1"/> 
       <xs:enumeration value="C"/> 
       <xs:enumeration value="M"/> 
       <xs:enumeration value="S"/> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:attribute> 
    </xs:complexType> 
</xs:element> 
+0

Thaank Dank für Ihre Antwort, aber das Problem ist, dass ich auf eine XSD-Datei arbeiten (bereits vorhanden) mit mehr als 1500 Zeilen –

+0

Wollen Sie damit sagen Sie nicht die XSD (und daher suchen ändern können eine XJC-only-Lösung)? Kannst du bitte sonst erklären, warum die Größe in diesem Fall eine Rolle spielt? Außerdem empfehle ich Ihnen, Details zu Ihrem speziellen Setup anzugeben: JDK und JAXB Version + Implementierung im Besonderen. –

+1

Ja Ich kann die XSD (XSD von einem anderen Hersteller) nicht ändern Ich benutze das JDK 6 und JAXB 2.2, ich versuche automatisch xml Dateien (gefüllt mit zufälligen Daten) aus xsd Dateien zu generieren. Danke –