2009-02-25 20 views
8

Al generar Java desde un XSD mediante el compilador XJC, siempre me dan el tipo java.lang.String para los elementos con simpleTypes anónimos como este:JAXB: tipos simples anónimos como enumeraciones?

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

Por supuesto, quiero una enumeración para esto. ¿Hay alguna manera de engañar a XJC para que genere y use uno?

Estamos usando JAXB 2.1.3. Nota: antes de preguntar, no, no puedo cambiar el esquema y adaptarlo a los errores de XJC.

Respuesta

14

Usted tiene que poner en su archivo 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

que tenía una pregunta muy similar, pregunté en la lista de correo JAXB y consiguió this fairly helpful response (no han tenido tiempo de probarlo sin embargo)

edición: si estamos hablando acerca de la generación automática de la clase enum, en lugar de solo asociar automáticamente a una clase enum que usted mismo escribe, creo que podría escribir una clase java que analizaría el archivo de esquema y generaría automáticamente el código de Java para esa enumeración. (A continuación, ejecutar esa clase Java cada vez que llame xjc)

+0

me las arreglé para hacer esto sin definir mi propio tipo de enumeración - ver mi respuesta. –

+0

Su enlace está roto. –

+0

lo arregló, gracias. –

5

Aquí es un ejemplo de cómo he implementado este. Agregaré todo el xjb para que esté completo, ya que admito que al mirar ejemplos existentes todavía me resulta un poco confuso.

tope aquí tienes archivos .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> 

Aquí, los enlaces se refieren a mis tipos simples que se declaran a nivel de la raíz en mi búsqueda-constraints.xsd. He aquí un extracto de ese archivo:

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

Cuestiones relacionadas