Network Deployment (Distributed operating systems), v8.0 > Develop and deploying applications > Develop web services > Use JAXB for XML data binding


Use schemagen to generate an XML schema file from a Java class


Overview

We use schemagen to map Java classes, data and relationships, to XML schema files, which then allows us to...

To develop web services with existing beans, use wsgen. After artifacts are generated, create an XML schema file using schemagen, which processes either...

Annotations can customize the mappings from classes to schema components. XML schema files, along with annotated Java class files, contain information required by the JAXB runtime to parse the XML documents for marshaling and unmarshaling.

The wsimport, wsgen, schemagen and xjc tools are not supported on the z/OS platform. This functionality is provided by the assembly tools.

wsimport, wsgen, schemagen and xjc tools are located in...

WAS_HOME\bin\
Similar tooling is provided by JDK 6. On some occasions, the artifacts generated by both the tooling provided by WebSphere Application Server and the JDK support the same levels of the specifications. In general, the artifacts generated by the JDK tools are portable across other compliant runtime environments. However, IBM recommends using WAS v8 tools.

WAS v8 supports the JAXB 2.2 specification. JAX-WS 2.2 requires JAXB 2.2 for data binding.

JAXB provides compilation support to enable you to configure the schemagen schema generator so that it does not automatically generate a new schema. This is helpful if you are using a common schema such as the W3C, XML Schema, WSDL, or WS-Addressing and you do not want a new schema generated for a particular package that is referenced. The location attribute on the @XmlSchema annotation causes the schemagen generator to refer to the URI of the existing schema instead of generating a new one.

In addition to using schemagen from the command-line, you can invoke using the Ant task...

ws_ant.sh com.sun.tools.jxc.SchemaGenTask

When running schemagen, the schema generator does not correctly read the @XmlSchema annotations from the package-info class file to derive targetNamespaces. Instead of using the @XMLSchema annotation, use one of the following methods:


Procedure

  1. Locate the Java source files or Java class files to use in generating an XML schema file. Ensure that all classes referenced by your Java class files are contained in the classpath or are provided to the tool using the-classpath/-cp options.

  2. Use the JAXB schema generator, schemagen command to generate an XML schema. The schema generator is located in the WAS_HOME\bin\ directory.

    (Windows)

    WAS_HOME\bin\schemagen.bat myObj1.java myObj2.java
    (AIX) (Solaris)
    WAS_HOME/bin/schemagen.sh myObj1.java myObj2.java

    The parameters, myObj1.java and myObj2.java, are the names of the Java files containing the data objects. If myObj1.java or myObj2.java refer to Java classes that are not passed into the schemagen command, use the -cp option to provide the classpath location for these Java classes. Read about the schemagen command to learn more about this command and additional options that you can specify.

  3. (Optional) Use JAXB program annotations defined in the javax.xml.bind.annotations package to customize the JAXB XML schema mappings.
  4. (Optional) Configure the location property on the @XmlSchema annotation to indicate to the schema compiler to use an existing schema rather than generating a new one. For example,
    @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
    
    the location="http://example.org/test.xsd" indicates the location on the existing schema to schemagen and a new schema is not generated.


Results

Now that we have generated an XML schema file from Java classes, you are ready to marshal and unmarshal the Java objects as XML instance documents. The schemagen command does not differentiate the XML namespace between multiple @XMLType annotations that have the same @XMLType name defined within different Java packages. When this scenario occurs, the following error is produced:

Error: Two classes have the same XML type name ....
Use @XmlType.name and @XmlType.namespace to assign different names to them...
This error indicates we have class names or @XMLType.names that have the same name, but exist within different Java packages.

To prevent this error, add the @XML.Type.namespace class to the existing @XMLType annotation to differentiate between the XML types.


Example

The following example illustrates how JAXB tooling can generate an XML schema file from an existing Java class, Bookdata.java.

  1. Copy the following Bookdata.java file to a temporary directory.
    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. Open a command prompt.
  3. Run the schemagen schema generator tool from the directory where you copied the Bookdata.java file.

    (Windows)

    WAS_HOME\bin\schemagen.bat Bookdata.java
    
    (AIX) (Solaris)
    WAS_HOME/bin/schemagen.sh Bookdata.java
    
  4. The XML schema file, schema1.xsd is generated:
    <?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> 

Refer to the JAXB Reference implementation documentation for additional information about the schemagen command.


Related

JAXB
Use JAXB for XML data binding
Use JAXB xjc tooling to generate JAXB classes from an XML schema file
Use the JAXB runtime to marshal and unmarshal XML documents
schemagen command for JAXB applications
JAX-WS annotations
Web services specifications and APIs
JAXB 2.2 Reference implementation

+

Search Tips   |   Advanced Search