2016-05-17 32 views
1

Ich habe mehrere XSD-Dateien mit Strukturen wie folgt aus:XJC erzeugt keine Enum innerhalb xs: union

<xs:complexType name="SomeThing" abstract="false"> 
    <xs:sequence> 
     <xs:element name="id" type="schema2:SomeIdTypeClass" minOccurs="1" maxOccurs="1"/> 
     <xs:element name="myType" type="schema1:MyType" minOccurs="1" maxOccurs="1"/> 
    </xs:sequence> 
</xs:complexType> 

<xs:simpleType name="MyType"> 
    <xs:union> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
        <xs:enumeration value="APPLE"/> 
        <xs:enumeration value="ORANGE"/> 
        <xs:enumeration value="BANANA"/> 
       </xs:restriction> 
      </xs:simpleType> 
      <xs:simpleType> 
       <xs:restriction base="xs:string"> 
       <xs:pattern value="OTHER:[a-zA-Z_][a-zA-Z0-9_]*"/> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:union> 
</xs:simpleType> 

ich den XJC Befehl bin mit dem Java-Klassen auf der Konsole zu erzeugen, nicht maven oder Ameise oder jedes andere Build-Tool.

Alle Klassen scheinen in Ordnung zu sein, außer diese Art von Enums. Die Klassen, die den Aufzählungstyp verwenden, bezeichnen ihn nur als String, z. Die Etwas Klasse enthält MyType nur als String, und nicht als ENUM, wie ich es erwarten würde.

In einer anderen Datei habe ich so etwas, wo die Enums ohne Probleme generiert werden und referenzierende Klassen verwenden es als Enums, wie sie sollten.

<xs:simpleType name="SizeType"> 
<xs:restriction base="xs:string"> 
     <xs:enumeration value="SMALL"/> 
     <xs:enumeration value="MEDIUM"/> 
     <xs:enumeration value="LARGE"/> 
</xs:restriction> 

Ich will nicht die XSD-Dateien wechseln, da sie von mir nicht erzeugt werden, und ich habe ein paar Dateien mit vielen dieser Elemente.

Ich kam zu dem Schluss, dass ich eine Art von XJB Einbindemappe verwenden, aber ich kann nicht herausfinden, was genau muss ich da schreiben:

Im Folgenden gibt mir nur die Fehlermeldung „führt zu viele Zielknoten“

<jaxb:bindings version="2.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
jaxb:extensionBindingPrefixes="xjc"> 
    <jaxb:bindings schemaLocation="MySchema.xsd" node="/xs:schema"> 
     <jaxb:bindings node="//xs:simpleType[@name='MyType']/xs:union/xs:simpleType"> 
      <jaxb:typesafeEnumClass name="MyType"/> 
     </jaxb:bindings>  
    </jaxb:bindings> 
</jaxb:bindings> 

Hinzufügen multiple =‚true‘ löst das aber noch nicht geben Sie mir die Aufzählungen, die ich will.

Edit: Wenn ich entfernen Sie die xs: union, so dass ich ein normales xs: simple wie folgt aus:

<xs:simpleType name="MyType"> 
    <xs:restriction base="xs:string"> 
    <xs:pattern value="OTHER:[a-zA-Z_][a-zA-Z0-9_]*"/> 
    <xs:enumeration value="APPLE"/> 
    <xs:enumeration value="ORANGE"/> 
    <xs:enumeration value="BANANA"/> 
    </xs:restriction>    
</xs:simpleType> 

Dann funktioniert es wie beabsichtigt. Ich möchte immer noch nicht diesen Weg gehen und die Schemata bearbeiten, wenn ich es nicht tun muss. Es muss einen Weg geben.

Antwort

0

Sie müssen die folgende Bindung verwenden.

<jaxb:bindings version="2.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
jaxb:extensionBindingPrefixes="xjc"> 
<jaxb:bindings schemaLocation="MySchema.xsd" node="/xs:schema"> 
<jxb:bindings node="//xs:element[@name='MyType']"> 
      <jxb:property > 
       <jxb:baseType name="java.lang.String"></jxb:baseType> 
      </jxb:property> 
     </jxb:bindings> 
     </jxb:bindings>