2009-02-25 15 views
8

Quando si generano Java da un XSD tramite il compilatore XJC, ho sempre arrivare il tipo java.lang.String per gli elementi con simpleTypes anonimi come questo:JAXB: tipi semplici anonimi come enumerazioni?

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

Naturalmente, voglio un'enumerazione per questo. C'è un modo per ingannare XJC nella generazione e nell'utilizzo di uno?

Stiamo utilizzando JAXB 2.1.3. Nota: prima di chiedere, no, non posso cambiare lo schema e adattarlo agli errori di XJC.

risposta

14

Devi mettere nel vostro file XJC:

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

o

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

avevo una domanda molto simile, ho chiesto sulla mailing list JAXB e ottenuto this fairly helpful response (non hanno avuto il tempo di provarlo però)

edit: se si sta parlando di generando automaticamente il enum class, piuttosto che mappare automaticamente ad una classe enum che scrivi tu stesso, penserei che potresti scrivere una classe java che analizzerebbe il file dello schema e genererebbe automaticamente il codice java per quell'enumerazione. (Quindi eseguire la classe Java ogni volta che si chiama xjc)

+0

sono riuscito a fare questo senza definire il mio tipo enum - vedere la mia risposta. –

+0

Il tuo link è rotto. –

+0

risolto, grazie. –

5

Ecco un esempio di come ho implementato questo. Aggiungerò l'intero xjb per completezza dato che ammetto di aver guardato degli esempi esistenti, ho trovato ancora un po 'di confusione.

Here's il file di .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> 

Qui, le associazioni si riferiscono ai miei tipi semplici che sono dichiarati a livello principale nella mia ricerca-constraints.xsd. Ecco un estratto di quel file:

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