Utilización de herramientas de Schemagen JAXB para generar un archivo de esquema XML a partir de una clase Java

Utilice las herramientas de schemagen de JAXB (Java™ Architecture for XML Binding) para generar un archivo de esquema XML a partir de clases Java.

Antes de comenzar

Identifique las clases Java o un conjunto de objetos Java para correlacionarlos con un archivo de esquema XML.

Acerca de esta tarea

Utilice las API y herramientas JAXB para establecer correlaciones entre las clases Java y el esquema XML. Los documentos de esquema XML describen los elementos de datos y las relaciones de un documento XML. Después de un enlace o una correlación de datos, puede convertir documentos XML en objetos Java, y viceversa. Ahora puede acceder a datos almacenados en un documento XML sin la necesidad de comprender la estructura de los datos.

Para desarrollar servicios web utilizando un enfoque de desarrollo ascendente a partir de JavaBeans o enterprise beans existentes, utilice la herramienta wsgen para generar los artefactos para aplicaciones JAX-WS (API de Java para servicios web basados en XML). Después de que se generen los artefactos Java para la aplicación, puede crear un documento de esquema XML a partir de una aplicación Java existente que represente los elementos de datos de una aplicación Java utilizando el generador de esquemas JAXB, la herramienta de línea de mandatos schemagen . El generador de esquemas JAXB procesa archivos fuente Java o archivos de clase. Las anotaciones de clase Java proporcionan la posibilidad de personalizar las correlaciones predeterminadas de las clases Java existentes a los componentes de esquema generados. El archivo de esquema XML junto con los archivos de clase Java anotados contienen toda la información necesaria que el tiempo de ejecución JAXB necesita para analizar los documentos XML para la ordenación y desordenación.

Puede crear un documento de esquema XML a partir de una aplicación Java existente que represente los elementos de datos de una aplicación Java utilizando el generador de esquemas JAXB, la herramienta de línea de mandatos schemagen . El generador de esquemas JAXB procesa archivos fuente Java o archivos de clase. Las anotaciones de clase Java proporcionan la posibilidad de personalizar las correlaciones predeterminadas de las clases Java existentes a los componentes de esquema generados. El archivo de esquema XML junto con los archivos de clase Java anotados contienen toda la información necesaria que el tiempo de ejecución JAXB necesita para analizar los documentos XML para la ordenación y desordenación.

Configuraciones soportadas: Las herramientas de línea de mandatos wsimport, wsgen, schemagen y xjc no están soportadas en la plataforma z/OS® . Esta funcionalidad la proporcionan las herramientas de ensamblaje que se proporcionan con WebSphere® Application Server que se ejecuta en la plataforma z/OS . Obtenga información sobre estas herramientas de línea de mandatos para las aplicaciones JAX-WS para obtener más información sobre estas herramientas.
Práctica recomendada: WebSphere Application Server proporciona las herramientas JAX-WS (Java API for XML-Based Web Services) y JAXB (Java Architecture for XML Binding). Las herramientas de línea de mandatos wsimport, wsgen, schemagen y xjc se encuentran en el directorio raíz_servidor_aplicaciones\bin\ en WebSphere Application Server tradicional.Los mandatos xjc y schemagen se encuentran en el directorio raíz_servidor_aplicaciones\jaxb\bin\ en el perfil de Liberty. En algunas ocasiones, los artefactos generados por las herramientas proporcionadas por WebSphere Application Server y el JDK dan soporte a los mismos niveles de las especificaciones. En general, los artefactos generados por las herramientas JDK tienen portabilidad en otros entornos de ejecución compatibles. Sin embargo, se recomienda utilizar las herramientas que se proporcionan con este producto para lograr una integración sin fisuras en el entorno de WebSphere Application Server y aprovechar las características que sólo se pueden soportar en WebSphere Application Server. Para aprovechar las herramientas de JAX-WS y JAXB V2.2, utilice las herramientas que se proporcionan con el servidor de aplicaciones y que se encuentran en el directorio raíz_servidor_aplicaciones\bin\.
Configuraciones soportadas: Este producto da soporte a la especificación JAXB 2.2 . JAX-WS 2.2 requiere JAXB 2.2 para el enlace de datos.

JAXB proporciona soporte de compilación que permite configurar el esquema schemagen del generador de modo que no genere automáticamente un esquema nuevo. Esto resulta útil si está utilizando un esquema común como, por ejemplo, W3C (World Wide Web Consortium), XML Schema, WSDL (Web Services Description Language) o WS-Addressing y no desea que se genere un nuevo esquema para uno de los paquetes a los que se hace referencia. El atributo location de la anotación @XmlSchema hace que el generador schemagen se refiera al URI del esquema existente, en lugar de generar uno nuevo.

Además de utilizar la herramienta schemagen desde la línea de mandatos, puede invocar esta herramienta JAXB desde entornos de compilación Ant. Utilice la tarea de Ant com.sun.tools.jxc.SchemaGenTask desde el entorno de compilación Ant para invocar la herramienta del generador de esquemas schemagen. Para funcionar correctamente, esta tarea Ant necesita que se invoque Ant utilizando el script ws_ant.

Evitar problemas: Al ejecutar la herramienta schemagen , el generador de esquemas no lee correctamente las anotaciones @XmlSchema del archivo de clase package-info para derivar targetNamespaces. En lugar de utilizar la anotación @XMLSchema, utilice uno de los métodos siguientes:
  • Suministre un archivo package-info.java con @XmlSchema; por ejemplo:
    schemagen sample.Address sample\package-info.java
  • Utilice el atributo namespace de la anotación @XmlType para especificar un espacio de nombres; por ejemplo:
    @XmlType(namespace="http://myNameSpace")

Procedimiento

  1. Localice los archivos fuente Java o los archivos de clase Java para utilizarlos en la generación de un archivo de esquema XML.
    Asegúrese de que todas las clases a las que hacen referencia los archivos de clase Java están contenidas en la vía de acceso de clases o se proporcionan a la herramienta utilizando las opciones-classpath/-cp .
  2. Utilice el mandato schemagen del generador de esquemas JAXB para generar un esquema XML.
    El generador de esquemas se encuentra en el directorio raíz_servidor_aplicaciones\bin\.
    [Windows]
    app_server_root\bin\schemagen.bat myObj1.java myObj2.java
    [Linux][AIX][HP-UX][Solaris]
    app_server_root/bin/schemagen.sh myObj1.java myObj2.java
    [IBM i]
    app_server_root/bin/schemagen myObj1.java myObj2.java

    Los parámetros, myObj1.java y myObj2.java, son los nombres de los archivos Java que contienen los objetos de datos. Si myObj1.java o myObj2.java hacen referencia a clases Java que no se pasan al mandato schemagen , debe utilizar la opción -cp para proporcionar la ubicación de vía de acceso de clases para estas clases Java.

    Obtenga información sobre el mandato schemagen para obtener más información sobre este mandato y las opciones adicionales que se pueden especificar.
  3. (Opcional) Utilice las anotaciones de programa JAXB definidas en el paquete javax.xml.bind.annotations para personalizar las correlaciones de esquema XML JAXB.
  4. (Opcional) Configure la propiedad location en la anotación @XmlSchema para indicar al compilador de esquemas que utilice un esquema existente en lugar de generar uno nuevo.
    Por ejemplo:
    @XmlSchema(namespace="foo")
    package foo;
    @XmlType
    class Foo {
    @XmlElement Bar zot;
    }
    @XmlSchema(namespace="bar",
    location="http://example.org/test.xsd")
    package bar;
    @XmlType
    class Bar {
    ...
    }
    <xs:schema targetNamespace="foo">
    <xs:import namespace="bar"
    schemaLocation="http://example.org/test.xsd"/>
    <xs:complexType name="foo">
    <xs:sequence>
    <xs:element name="zot" type="bar:Bar" xmlns:bar="bar"/>
    </xs:sequence>
    </xs:complex
    location="http://example.org/test.xsd" indica la ubicación en el esquema existente para la herramienta schemagen y no se genera un esquema nuevo.

Resultados

Ahora que ha generado un archivo de esquema XML a partir de clases Java, está preparado para clasificar y desclasificar los objetos Java como documentos de instancia XML.

Evitar problemas: el mandato schemagen no diferencia el espacio de nombres XML entre varias anotaciones @XMLType que tienen el mismo nombre @XMLType definido en distintos paquetes Java. Cuando se dé este escenario, se producirá el siguiente error:
Error: Dos clases tienen el mismo nombre de tipo XML...
Utilice @XmlType.name y @XmlType.namespace para asignarles nombres diferentes...
Este error indica que tiene nombres de clase o valores de @XMLType.name que tienen el mismo nombre, pero existen en paquetes Java diferentes. Para impedir este error, añada la clase @XML.Type.namespace a la anotación @XMLType existente para distinguir entre los tipos de XML.

Ejemplo

El ejemplo siguiente ilustra cómo las herramientas JAXB pueden generar un archivo de esquema XML a partir de una clase Java existente, Bookdata.java.
  1. Copie el siguiente archivo Bookdata.java a un directorio temporal.
    package generated;
    
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlType;
    import javax.xml.datatype.XMLGregorianCalendar;
    
    
    
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "bookdata", propOrder = {
        "author",
        "title",
        "genre",
        "price",
        "publishDate",
        "description"
    })
    public class Bookdata {
    
        @XmlElement(required = true)
        protected String author;
        @XmlElement(required = true)
        protected String title;
        @XmlElement(required = true)
        protected String genre;
        protected float price;
        @XmlElement(name = "publish_date", required = true)
        protected XMLGregorianCalendar publishDate;
        @XmlElement(required = true)
        protected String description;
        @XmlAttribute
        protected String id;
    
         public String getAuthor() {
            return author;
        }
        public void setAuthor(String value) {
            this.author = value;
        }
        public String getTitle() {
            return title;
        }
    
         public void setTitle(String value) {
            this.title = value;
        }
    
      
        public String getGenre() {
            return genre;
        }
       
        public void setGenre(String value) {
            this.genre = value;
        }
    
        
        public float getPrice() {
            return price;
        }
    
        
        public void setPrice(float value) {
            this.price = value;
        }
    
       
        public XMLGregorianCalendar getPublishDate() {
            return publishDate;
        }
    
        
        public void setPublishDate(XMLGregorianCalendar value) {
            this.publishDate = value;
        }
    
       
        public String getDescription() {
            return description;
        }
    
        
        public void setDescription(String value) {
            this.description = value;
        }
    
       
        public String getId() {
            return id;
        }
    
        
        public void setId(String value) {
            this.id = value;
        }
    
    }
  2. Abra un indicador de mandatos.
  3. Ejecute la herramienta del generador de esquemas schemagen desde el directorio donde ha copiado el archivo Bookdata.java.
    [Windows]
    app_server_root\bin\schemagen.bat Bookdata.java
    [Linux][AIX][HP-UX][Solaris]
    app_server_root/bin/schemagen.sh Bookdata.java 
    [IBM i]
    app_server_root/bin/schemagen Bookdata.java
  4. Se genera el archivo de esquema XML schema1.xsd:
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
      <xs:complexType name="bookdata">
        <xs:sequence>
          <xs:element name="author" type="xs:string"/>
          <xs:element name="title" type="xs:string"/>
          <xs:element name="genre" type="xs:string"/>
          <xs:element name="price" type="xs:float"/>
          <xs:element name="publish_date" type="xs:anySimpleType"/>
          <xs:element name="description" type="xs:string"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:string"/>
      </xs:complexType>
    </xs:schema>
    

Consulte la documentación de la implementación de la referencia JAXB, si desea información adicional sobre el mandato schemagen.