Download
FAQ History |
API
Search Feedback |
General Usage Instructions
This section provides general usage instructions for the examples used in this chapter, including how to build and run the applications using the Ant build tool, and provides details about the default schema-to-JAXB bindings used in these examples.
Description
This chapter describes ten examples; the basic examples (Unmarshal Read, Modify Marshal, Create Marshal, Unmarshal Validate, Validate-On-Demand) demonstrate basic JAXB concepts like ummarshalling, marshalling, and validating XML content, while the customize examples (Customize Inline, Datatype Converter, External Customize, Fix Collides, Bind Choice) demonstrate various ways of customizing the binding of XML schemas to Java objects. Each of the examples in this chapter is based on a Purchase Order scenario. With the exception of the Bind Choice and the Fix Collides examples, each uses an XML document,
po.xml
, written against an XML schema,po.xsd
.
Note: These examples are all located in the
$JWSDP_HOME/jaxb/samples
directory.
Each example directory contains several base files:
po.xsd
is the XML schema you will use as input to the JAXB binding compiler, and from which schema-derived JAXB Java classes will be generated. For the Customize Inline and Datatype Converter examples, this file contains inline binding customizations. Note that the Bind Choice and Fix Collides examples useexample.xsd
rather thanpo.xsd
.po.xml
is the Purchase Order XML file containing sample XML content, and is the file you will unmarshal into a Java content tree in each example. This file is almost exactly the same in each example, with minor content differences to highlight different JAXB concepts. Note that the Bind Choice and Fix Collides examples useexample.xml
rather thanpo.xml
.Main.java
is the main Java class for each example.build.xml
is an Ant project file provided for your convenience. Use Ant to generate, compile, and run the schema-derived JAXB classes automatically. Thebuild.xml
file varies across the examples.MyDatatypeConverter.java
in theinline-customize
example is a Java class used to provide custom datatype conversions.binding.xjb
in the External Customize, Bind Choice, and Fix Collides examples is an external binding declarations file that is passed to the JAXB binding compiler to customize the default JAXB bindings.example.xsd
in the Fix Collides example is a short schema file that contains deliberate naming conflicts, to show how to resolve such conflicts with custom JAXB bindings.Using the Examples
As with all applications that implement schema-derived JAXB classes, as described above, there are two distinct phases in using JAXB:
In the case of these examples, you perform these steps by using
Ant
with thebuild.xml
project file included in each example directory.Configuring and Running the Samples
The
build.xml
file included in each example directory is an Ant project file that, when run, automatically performs the following steps:
- Updates your
CLASSPATH
to include the necessary schema-derived JAXB classes.- Runs the JAXB binding compiler to generate JAXB Java classes from the XML source schema,
po.xsd
, and puts the classes in a package namedprimer.po
.- Generates API documentation from the schema-derived JAXB classes using the Javadoc tool.
- Compiles the schema-derived JAXB classes.
- Runs the
Main
class for the example.Solaris/Linux
- Set the following environment variables:
export JAVA_HOME=<
your J2SE installation directory
>
export JWSDP_HOME=<your JWSDP installation directory
>
- Change to the desired example directory.
For example, to run the Unmarshal Read example:
cd <
JWSDP_HOME
>/jaxb/samples/unmarshal-read
(
<
JWSDP_HOME
>
is the directory where you installed the Java WSDP bundle.)- Run ant:
$JWSDP_HOME/apache-ant/bin/ant -emacs
- Repeat these steps for each example.
Windows NT/2000/XP
- Set the following environment variables:
set JAVA_HOME=<
your J2SE installation directory
>
set JWSDP_HOME=<your JWSDP installation directory
>
- Change to the desired example directory.
For example, to run the Unmarshal Read example:
cd <
JWSDP_HOME
>\jaxb\samples\unmarshal-read
(
<
JWSDP_HOME
>
is the directory where you installed the Java WSDP bundle.)- Run ant:
%JWSDP_HOME%\apache-ant\bin\ant -emacs
- Repeat these steps for each example.
The schema-derived JAXB classes and how they are bound to the source schema is described in About the Schema-to-Java Bindings. The methods used for building and processing the Java content tree are described in Basic Examples.
JAXB Compiler Options
The JAXB schema binding compiler is located in the
<
JWSDP_HOME
>/jaxb/bin
directory. There are two scripts in this directory:xjc.sh
(Solaris/Linux) andxjc.bat
(Windows).Both
xjc.sh
andxjc.bat
take the same command-line options. You can display quick usage instructions by invoking the scripts without any options, or with the-help
switch. The syntax is as follows:The
xjc
command-line options are listed in Table 2-2.
Table 2-2 xjc Command-Line Options Option or Argument Description<
schema
>
One or more schema files to compile.-nv
Do not perform strict validation of the input schema(s). By default,xjc
performs strict validation of the source schema before processing. Note that this does not mean the binding compiler will not perform any validation; it simply means that it will perform less-strict validation.-extension
By default,xjc
strictly enforces the rules outlined in the Compatibility chapter of the JAXB Specification. Specifically, Appendix E.2 defines a set of W3C XML Schema features that are not completely supported by JAXB v1.0. In some cases, you may be able to use these extensions with the-extension
switch. In the default (strict) mode, you are also limited to using only the binding customizations defined in the specification. By using the-extension
switch, you can enable the JAXB Vendor Extensions.-b <
file
>
Specify one or more external binding files to process (each binding file must have it's own-b
switch). The syntax of the external binding files is extremely flexible. You may have a single binding file that contains customizations for multiple schemas, or you can break the customizations into multiple bindings files; for example:xjc schema1.xsd schema2.xsd schema3.xsd -b bindings123.xjb
xjc schema1.xsd schema2.xsd schema3.xsd -b bindings1.xjb -b bindings2.xjb -b bindings3.xjb
Note that the ordering of schema files and binding files on the command line does not matter.-d
<
dir
>
By default,xjc
will generate Java content classes in the current directory. Use this option to specify an alternate output directory. The directory must already exist;xjc
will not create it for you.-p
<
pkg
>
Specifies the target package for schema-derived classes. This option overrides any binding customization for package name as well as the default package name algorithm defined in the JAXB Specification.-host
<
proxyHost
>
Sethttp.proxyHost
to<proxyHost>
.-port
<
proxyPort
>
Sethttp.proxyPort
to<proxyPort>
.-classpath
<
arg
>
Specify where to find client application class files used by the<jxb:javaType>
and<xjc:superClass>
customizations.-catalog
<
file
>
Specify catalog files to resolve external entity references.Supports TR9401, XCatalog, and OASIS XML Catalog format.-readOnly
Generated source files will be marked read-only. By default,xjc
does not write-protect the schema-derived source files it generates.-use-runtime <
pkg
>
Suppress the generation of theimpl.runtime
package and refer to another existing runtime in the specified package. This option is useful when you are compiling multiple independent schemas. Because the generated impl.runtime packages are identical, except for their package declarations, you can reduce the size of your generated codebase by telling the compiler to reuse an existingimpl.runtime
package.-xmlschema
Treat input schemas as W3C XML Schema (default). If you do not specify this switch, your input schemas will be treated as W3C XML Schema.-relaxng
Treat input schemas as RELAX NG (experimental, unsupported). Support for RELAX NG schemas is provided as a JAXB Vendor Extension.-dtd
Treat input schemas as XML DTD (experimental, unsupported). Support for RELAX NG schemas is provided as a JAXB Vendor Extension.-help
Display this help message.
The command invoked by the
xjc.sh
andxjc.bat
scripts is equivalent to the Java command:About the Schema-to-Java Bindings
When you run the JAXB binding compiler against the
po.xsd
XML schema used in the basic examples (Unmarshal Read, Modify Marshal, Create Marshal, Unmarshal Validate, Validate-On-Demand), the JAXB binding compiler generates a Java package namedprimer.po
containing eleven classes, making a total of twelve classes in each of the basic examples:
Note: You should never directly use the generated implementation classes--that is,
*Impl.java
in the <packagename
>/impl
directory. These classes are not directly referenceable because the class names in this directory are not standardized by the JAXB specification. TheObjectFactory
method is the only portable means to create an instance of a schema-derived interface. There is also anObjectFactory.newInstance(Class JAXBinterface)
method that enables you to create instances of interfaces.
These classes and their specific bindings to the source XML schema for the basic examples are described below.
Schema-Derived JAXB Classes
The code for the individual classes generated by the JAXB binding compiler for the basic examples is listed below, followed by brief explanations of its functions. The classes listed here are:
Comment.java
In
Comment.java
:
- The
Comment.java
class is part of theprimer.po
package.Comment
is a public interface that extendsjavax.xml.bind.Element
.- Content in instantiations of this class bind to the XML schema element named
comment
.- The
getValue()
andsetValue()
methods are used to get and set strings representing XMLcomment
elements in the Java content tree.The
Comment.java
code looks like this:package primer.po; public interface Comment extends javax.xml.bind.Element { String getValue(); void setValue(String value); }Items.java
In
Items.java
, below:
- The
Items.java
class is part of theprimer.po
package.- The class provides public interfaces for
Items
andItemType
.- Content in instantiations of this class bind to the XML ComplexTypes
Items
and its child elementItemType
.Item
provides thegetItem()
method.ItemType
provides methods for:
getPartNum();
setPartNum(String value);
getComment();
setComment(java.lang.String value);
getUSPrice();
setUSPrice(java.math.BigDecimal value);
getProductName();
setProductName(String value);
getShipDate();
setShipDate(java.util.Calendar value);
getQuantity();
setQuantity(java.math.BigInteger value);
The
Items.java
code looks like this:package primer.po; public interface Items { java.util.List getItem(); public interface ItemType { String getPartNum(); void setPartNum(String value); java.lang.String getComment(); void setComment(java.lang.String value); java.math.BigDecimal getUSPrice(); void setUSPrice(java.math.BigDecimal value); String getProductName(); void setProductName(String value); java.util.Calendar getShipDate(); void setShipDate(java.util.Calendar value); java.math.BigInteger getQuantity(); void setQuantity(java.math.BigInteger value); } }ObjectFactory.java
In
ObjectFactory.java
, below:For example, in this case, for the Java interface
primer.po.Items.ItemType
,ObjectFactory
creates the methodcreateItemsItemType()
.The
ObjectFactory.java
code looks like this:package primer.po; public class ObjectFactory extends com.sun.xml.bind.DefaultJAXBContextImpl { /** * Create a new ObjectFactory that can be used to create * new instances of schema derived classes for package: * primer.po */ public ObjectFactory() { super(new primer.po.ObjectFactory.GrammarInfoImpl()); } /** * Create an instance of the specified Java content * interface. */ public Object newInstance(Class javaContentInterface) throws javax.xml.bind.JAXBException { return super.newInstance(javaContentInterface); } /** * Get the specified property. This method can only be * used to get provider specific properties. * Attempting to get an undefined property will result * in a PropertyException being thrown. */ public Object getProperty(String name) throws javax.xml.bind.PropertyException { return super.getProperty(name); } /** * Set the specified property. This method can only be * used to set provider specific properties. * Attempting to set an undefined property will result * in a PropertyException being thrown. */ public void setProperty(String name, Object value) throws javax.xml.bind.PropertyException { super.setProperty(name, value); } /** * Create an instance of PurchaseOrder */ public primer.po.PurchaseOrder createPurchaseOrder() throws javax.xml.bind.JAXBException { return ((primer.po.PurchaseOrder) newInstance((primer.po.PurchaseOrder.class))); } /** * Create an instance of ItemsItemType */ public primer.po.Items.ItemType createItemsItemType() throws javax.xml.bind.JAXBException { return ((primer.po.Items.ItemType) newInstance((primer.po.Items.ItemType.class))); } /** * Create an instance of USAddress */ public primer.po.USAddress createUSAddress() throws javax.xml.bind.JAXBException { return ((primer.po.USAddress) newInstance((primer.po.USAddress.class))); } /** * Create an instance of Comment */ public primer.po.Comment createComment() throws javax.xml.bind.JAXBException { return ((primer.po.Comment) newInstance((primer.po.Comment.class))); } /** * Create an instance of Comment */ public primer.po.Comment createComment(String value) throws javax.xml.bind.JAXBException { return new primer.po.impl.CommentImpl(value); } /** * Create an instance of Items */ public primer.po.Items createItems() throws javax.xml.bind.JAXBException { return ((primer.po.Items) newInstance((primer.po.Items.class))); } /** * Create an instance of PurchaseOrderType */ public primer.po.PurchaseOrderType createPurchaseOrderType() throws javax.xml.bind.JAXBException { return ((primer.po.PurchaseOrderType) newInstance((primer.po.PurchaseOrderType.class))); } }PurchaseOrder.java
In
PurchaseOrder.java
, below:The
PurchaseOrder.java
code looks like this:package primer.po; public interface PurchaseOrder extends javax.xml.bind.Element, primer.po.PurchaseOrderType{ }PurchaseOrderType.java
In
PurchaseOrderType.java
, below:The
PurchaseOrderType.java
code looks like this:package primer.po; public interface PurchaseOrderType { primer.po.Items getItems(); void setItems(primer.po.Items value); java.util.Calendar getOrderDate(); void setOrderDate(java.util.Calendar value); java.lang.String getComment(); void setComment(java.lang.String value); primer.po.USAddress getBillTo(); void setBillTo(primer.po.USAddress value); primer.po.USAddress getShipTo(); void setShipTo(primer.po.USAddress value); }USAddress.java
In
USAddress.java
, below:The
USAddress.java
code looks like this:package primer.po; public interface USAddress { String getState(); void setState(String value); java.math.BigDecimal getZip(); void setZip(java.math.BigDecimal value); String getCountry(); void setCountry(String value); String getCity(); void setCity(String value); String getStreet(); void setStreet(String value); String getName(); void setName(String value); }
Download
FAQ History |
API
Search Feedback |
All of the material in The Java(TM) Web Services Tutorial is copyright-protected and may not be published in other works without express written permission from Sun Microsystems.