2011-01-25 18 views
34

Soy un principiante de JAXB y tengo problemas molestos cuando genero clases de Java con xjc. Me proporciona con un XSD como esto:JAXB: ¿Cómo cambiar los nombres de las clases generadas por XJC cuando se especifica el tipo attr en XSD?

<xs:element name="item" type="itemType"/> 
... 
<xs:complexType name="itemType"> 
    <xs:attribute name="id" type="xs:string" use="required"> 
    ...  
</xs:complexType> 

y xjc está generando una clase llamada ItemType.java, pero quiero que el nombre sea Item.java. Es decir, quiero que las clases generadas como si el XSD era así:

<xs:element name="item"> 
    <xs:complexType> 
    <xs:attribute name="id" type="xs:string" use="required"> 
     ... 
    </xs:complexType> 
</xs:element> 

No habrá ninguna reutilización de tipoElemento en cualquier otro elemento, es sólo la gente que construye el XSD le gusta de esta manera. Supongo que puede haber una manera de hacerlo con enlaces personalizados, pero todavía no he encontrado cómo.

¿Algún ayuda?

Gracias, Miguel

+0

¿Puede compartir su línea de comando final que utilizó? –

Respuesta

58

JAXB proporciona dos maneras de lograr esto:

1. Inline esquema Anntotations

Puede utilizar las anotaciones de esquema JAXB para controlar los nombres de las clases.

<xs:schema 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
     jaxb:version="2.1"> 

    <xs:complexType name="itemType"> 
     <xs:annotation> 
      <xs:appinfo> 
       <jaxb:class name="Item"/> 
      </xs:appinfo> 
     </xs:annotation> 
     <xs:attribute name="id" type="xs:string" use="required"/> 
    </xs:complexType> 

</xs:schema> 

2. externa del archivo Encuadernación

Esta personalización también se puede hacer a través de la unión y el archivo externo:

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
    version="2.1"> 

    <jxb:bindings schemaLocation="your-schema.xsd"> 
      <jxb:bindings node="//xs:complexType[@name='itemType']"> 
       <jxb:class name="Item"/> 
      </jxb:bindings> 
    </jxb:bindings> 

</jxb:bindings> 

La línea de comandos xjc sería:

xjc -d out -b binding.xml your-schema.xsd 
+1

Gracias Blaise. No puedo cambiar xsd, así que debe hacerse con un archivo de enlace externo. Por ahora, lo estoy haciendo como dijiste, pero me gustaría hacerlo más genérico. Es decir, si tengo un elemento con 'tipo' apuntando a un tipo complejo, ¿puedo gestionar que la compilación cree una clase, cuyo nombre es el nombre del elemento en lugar del nombre del tipo complejo? –

+3

lo que quiero decir es que si en el futuro las personas que crean el xsd agregan un nuevo en el xsd, ¿podría reutilizar ese archivo de enlace para que genere Auto? clase automáticamente, sin la necesidad de modificar el archivo de enlace? –

+1

im utilizando las etiquetas anteriores como lo sugiere Blaise y obteniendo el siguiente error: analizando un esquema ... El compilador [ERROR] no ha podido respetar esta personalización de clase. Se adjunta a un lugar incorrecto, o es incoherente con otras vinculaciones. línea 8 de file:/C: /subhasish/demo/src/main/java/demo.xml [ERROR] (la personalización arriba está unido a la siguiente ubicación en el sc hema) la línea 4 del archivo: /C:/subhasish/demo/src/main/java/demo.xsd Error al analizar un esquema. –

13

Bueno, finalmente encontré cómo hacerlo. Mi archivo de enlace externo es:

<?xml version="1.0"?> 
<jxb:bindings version="1.0" 
       xmlns:jxb="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" 
       jxb:extensionBindingPrefixes="xjc"> 

    <jxb:globalBindings>    
    <xjc:simple/> 
    </jxb:globalBindings> 

</jxb:bindings> 

y xjc comando debe ser ejecutado con -extension opción.

he encontrado la solución en esta página:

http://weblogs.java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html

Saludos, Miguel

1

Este es el archivo de unión externa que utilizo para cambiar el nombre de un complexType. Compila con wsdl2java de cxf.

<?xml version="1.0" encoding="UTF-8"?> 
<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema[1]"> 
     <jxb:bindings node="//xs:complexType[@name='VatNumber_exception']"> 
      <jxb:class name="VatNumException"/> 
     </jxb:bindings> 

    </jaxws:bindings> 
</jaxws:bindings> 
Cuestiones relacionadas