JAXB: ¿Cómo cambiar los nombres de clases generados por XJC cuando el tipo attr se especifica en XSD?


Soy un principiante de JAXB y estoy teniendo problemas molestos al generar clases Java con xjc. Se me proporciona un XSD como este:

<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 las clases generadas como si el XSD fuera 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 ItemType en ningún otro elemento, es solo 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.

Alguna ayuda?

Gracias, Miguel

Author: skaffman, 2011-01-25

3 answers

JAXB proporciona dos maneras de lograr esto:

1. Anntotations de esquema inline

Puede usar 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. Archivo de enlace externo

Esta personalización también se puede hacer a través de un archivo de enlace 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
 62
Author: Blaise Doughan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-25 14:32:55

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 el comando debe ejecutarse con la opción -extension.

Encontré la solución en esta página:

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

Saludos, Miguel

 13
Author: miguel perher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-27 15:33:26

Este es el archivo de enlace externo que uso 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>
 1
Author: nilsmagnus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-28 06:14:40