2009-02-25 8 views
8

Lors de la génération Java à partir d'un XSD via le compilateur XJC, je reçois toujours le type java.lang.String pour les éléments avec simpleTypes anonymes comme ceci:JAXB: Types simples anonymes comme 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> 

Bien sûr, je veux une énumération pour cela. Y a-t-il un moyen de tromper XJC dans la génération et l'utilisation d'un?

Nous utilisons JAXB 2.1.3. Note: avant de demander, non, je ne peux pas changer le schéma et l'adapter aux bugs de XJC.

Répondre

14

Vous devez mettre dans votre fichier XJC:

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

ou

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

J'avais une question très semblable, j'ai demandé sur la liste de diffusion et JAXB obtenu this fairly helpful response (ont pas eu le temps de l'essayer si)

edit: si vous parlez générer automatiquement la enum class, plutôt que de simplement mapper automatiquement à une classe enum que vous écrivez vous-même, je pense que vous pourriez écrire une classe java qui analyserait le fichier de schéma et générerait automatiquement le code java pour cette énumération. (Puis exécutez cette classe java chaque fois que vous appelez xjc)

+0

j'ai réussi à le faire sans définir mon propre type enum - voir ma réponse. –

+0

Votre lien est cassé. –

+0

l'a réparé, merci. –

5

Voici un exemple de la façon dont je mis en œuvre cela. J'ajouterai tout le xjb pour l'exhaustivité puisque j'avoue avoir regardé des exemples existants que je trouvais encore un peu confus.

Here's le fichier .xjb __gVirt_NP_NN_NNPS<__

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

Ici, les liaisons se réfèrent à mes types simples qui sont déclarés au niveau de la racine dans ma recherche-constraints.xsd. Voici un extrait de ce fichier:

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

Questions connexes