|
http://in.geocities.com/rsramsam/jaxb.htm |
JAXB
–AN
INTRODUCTION
Java Architecture for
XML-BINDING
------------------------------------------------------------
by
R.S.RAMASWAMY
------------------------------------------------------------
(First published in DeveloperIQ..MAY-2005)
(available in http://www.roseindia.net/ also)
(part-1)
JAX-pack, now being referred to as JWSDP,is
a very important development in J2EE.In the previous editions
(July,August,October-2004) we had
covered the basics of JAXP( Java -API for XML Processing), dealing with DOM,SAX,JDOM,TrAX etc. Part-1 of this
tutorial deals with general theory of JAXB and its importance in binding
XML to Java classes.
JAXB is a
component part of JAX set of
API's. SUN MICRO SYSTEMS is giving a
lot of importance to XML WebServices and within a short span, has released a
number of revisions of JWSDP ( Java WebService Development pack). It began with
JWSDP1.0 and now is running JWSDP1.5. (Version numbers have become very
important in modern software field, because, there is so much development
taking place almost every month.
This is true in J2EE/OpenSource & DotNet too. )
It appears that JAXB is available for downloading, as a part of JWSDP only, and cannot be
downloaded as such. So, we should download JWSDP , to gain access to JAXB for
experimentation.We are using JWSDP1.4.
JWSDP is essentially for XML-WebService
work. The constituent parts of this package are JAX-RPC, JAXM(Messaging)& JAXR(Registry).There is also SAAJ (
SOAP with Attachment)not to be confused with JAAS ( Java security). (Hopefully,
we will cover these topics , in coming editions).JAXP takes care of
DOM,SAX & XSLT .
JAXB allows Java developers to access and
process XML data without having to know XML or XML processing. For example,
there's no need to create or use a SAX parser or write callback methods. It
makes use of a given schema of an XML
document and automatically generates the required Java classes, corresponding
to that schema.( DeveloperIQ is now providing a detailed workshop on DTD, a
form of Schema).Modern trend focuses on XML representation of Data, for ease of
exchange in web-service and otherwise. If we have an xml representation of a
database, we can use JAXB to create a tree of Java objects and work with them in Java idiom..This is
known as XML-Databinding. .
Validation is an important
part of any XML document. Unlike HTML,
XML tags are user-defined. This is what gives XML its power and utility.
But, at the same time, to make it really useful, each such XML document should
have a 'schema'....Something like Data Definition in SQL. It should be
carefully noted that 'schema' is a general term. In the earlier days of XML,
the only schema that was known and used was DTD (Document-type-definition).
Even today, DTD is said to be the most prevalent 'schema' in use and best
known, among developers.
However, DTD was
found to have a number of limitations.Microsoft is credited with the
proposal for an alternative to DTD in the very early days of XML.It was known
as 'XML Schema'.The proposal was submitted to the W3C (World-wide Web
Consortium), which is the standards body for XML , HTML and related topics and
was later adopted by W3C with some modifications.
'XML-Schema' is
considered to be better than DTD, for a number of reasons. First, unlike a DTD,
an XML-Schema is itself an XML document. Secondly, it has provision for greater
variety of data-types than are available in DTD.It supports Name-space.
********************************************
|
JAXB Mapping of XML Schema Built-in Data
Types |
|
|
XML Schema Type |
Java Data Type |
|
xsd:string |
java.lang.String |
|
xsd:integer |
java.math.BigInteger |
|
xsd:int |
int |
|
xsd.long |
long |
|
xsd:short |
short |
|
xsd:decimal |
java.math.BigDecimal |
|
xsd:float |
float |
|
xsd:double |
Double |
|
xsd:boolean |
boolean |
|
xsd:byte |
byte |
|
xsd:QName |
javax.xml.namespace.QName |
|
xsd:dateTime |
java.util.Calendar |
|
xsd:base64Binary |
byte[] |
|
xsd:hexBinary |
byte[] |
|
xsd:unsignedInt |
long |
|
xsd:unsignedShort |
int |
|
xsd:unsignedByte |
short |
|
xsd:time |
java.util.Calendar |
|
xsd:date |
java.util.Calendar |
|
xsd:anySimpleType |
java.lang.String |
********************************************
However, an XML-Schema is of rather large size compared to the
corresponding DTD representation .
Because of this
'limitation' of XML-Schema, another validation scheme , known as Relax-NG ,
developed by another standards organization, known as OASIS ,is also prevalent.This schema is
comparatively compact. Be it DTD or XML-Schema or Relax-NG, all these topics
are heavy reading and belong properly to the study of XML by itself rather than
as applied XML in Java.Though , XML webservice is built entirely on XML and
SOAP, it is possible for a developer to build an effective webservice
application in ASP.net & AXIS, without going into the details of XML.It may
be said to be the main merit of ASP.net,that it hides the details of
implementation and allows the Application developer to concentrate on the
business-logic on hand.So does, Apache's AXIS.But, at some stage, a good
understanding of the inner working
details becomes useful, for trouble-shooting and advanced work.But, the danger
of 'missing the forest for the trees' , also is there , if we get into
implementation details, too deeply.
The problem in JAXB,
is that it originally dealt with DTD and later switched over to XML-Schema (And
many books were written about this earliest version of JAXB and are not
suitable now).. SUN promotes an alternative to the SOAP standard , known as Eb-XML , being developed under the
auspices of UNESCO & OASIS.This is said to be more attuned to the needs of
Vericals ( specific industries ). JAXB attempts to incorporate support for
Relax-NG also, as it is from OASIS..
When JAXB work started, it
dealt with DTD only, because at
that time the XML-Schema had not been standardized.Later versions ,are primarily
meant to work with XML-schema and DTD support
is only experimental. Same for
Relax-NG,but for an entirely different reason, because work on that is still
progressing. These areas are developing
so fast that books and articles become out-dated, very quickly, but they are
not withdrawn from the web/market, thus
confusing the readers. Information is getting 'dated', rapidly.With so
many acronyms around, it is better that
we try to understand what they mean and their context , before diving in.Hence,
the present tutorial attempts to give such an overview.
(The JWSDP1.4 package has the sub-folders for
JAXP,JAXB,JAXR,JAX-RPC,JSTL,SAAJ,XWS-SECURITY,XMLDSIG-xml
digital signature).
------
The latest release of
JWSDP is JWSDP1.5.
( Jan-2005).The following three items can be said to be
new or special improvements the JWSDP pack.
a) Java Streaming XML Parser
b) XML Digital Signature
c) JAXB(1.04)
--------------------------------------
a) (SJSXP)(Sun Java Streaming XML Parser
).
------------------------------
The Streaming API for XML (StAX)provides
a stream-based API for reading and writing XML documents. The StAX approach
is also known as "pull" parsing. This sounds like Microsoft's
method of XML processing, in DotNet platform.The DotNet platform has a
class known as XmlTextReader which provides a stream API which also is
based on 'pull' model.The usual SAX method is known as 'Push' model.The
'pull' model is said to be more efficient in some cases.(Interested readers can
refer to page 307-322 of a very valuable book..
'ASP.Net..Tips,Tutorials and Code' by a team of authors led by
Scott Mitchell(Techmedia).)
b)The Java-XML- Digital Signature package in the WSDP
provides a standard way for Java
developers to access digital signature services. To quote: ***Using the XML
Digital Signature APIs found in the WSDP, developers can sign and validate
digital content and represent the signatures in an XML format. The signatures
provide a standard way to verify that content originated from a known source
and was not altered during transmission***.
c) Coming now to JAXB,in the words of Sun Documentation,
***The Java Architecture for XML Binding (JAXB) project provides a standard API for automating the
mapping between XML documents and Java objects. Using JAXB, a
developer can compile a schema into Java classes that provide support for
marshaling, unmarshaling, accessing, updating, and validating. The main goal of
JAXB is to relieve the developer of these tasks so that they can be more
productive and be exposed to fewer XML-oriented issues. JAXB 1.0.4 provides
support for a subset of XML Schema and experimental support for
RelaxNG. RelaxNG is a simplified XML schema system sponsored by the Oasis
group. JAXB is currently integrated with JAX-RPC for easily transporting
objects across the wire.***.
There is common
agreement in Industry that XML-Schema
is better than DTD.
In a DTD, element content is mostly limited to strings
whereas an XML-Schema can set the data type of elements to very specific
types such as integers and date. However, with thousands of DTD based XML documents , being in use
today, it is vital that compatibility is maintained. Tools are said to be available for automating the
conversion of DTD into an equivalent Schema.
( readers can see p114 of XML-Unleashed by
Michael Morrison..Techmedia, for details).
If to create a valid
XML document, we begin by creating a DTD.(Document-type-Definition),such DTD
creation is more difficult than
creating a well-formed XML document, straight away! If the beginner can first
create an XML document and from that generate a DTD automatically, it will be
easier job.AlphaWorks of IBM created a Java library, DDbE(Data
Descriptors by Example),to make it easier for beginners to create the DTD. The
above library fulfils that role.For working properly, DDbE requires XML4j
parser from IBM. ( see p.636 of the
above book).Student readers can check up the current status of such automated
tools. Though unconventional, this approach, is easier and saves a lot of
labour. We get a readymade framework which can then be suitably modified. The
recommended method in JAXB is not to begin with DTD but to use an
XML-Schema.
--------------------------------------------
Let us now try to get
familiar with the technical terms in JAXB environment.
We begin from an XML-Schema
, first. An XML schema uses XML syntax to describe
the relationships among elements, attributes and entities in an XML document.
The purpose of an XML schema is to define a class of XML documents that must
adhere to a particular set of structural rules and data constraints.
There is a command in JAXB/bin known as xjc .(Actually,
it is a batch file which uses jaxb binding compiler.). We can invoke this batch
file from the command line (after setting the required path & classpath, to
be defined soon).The command is like :
>xjc books.xsd , where books.xsd is the
XML-Schema file being used.The command has a few optional arguments, to specify
the name of target directory, package name etc. Sometimes, we may prefer to use
an existing DTD as reference and in such cases, we can give -dtd as option and then specify the DTD
file).
When we run this command,it
generates a number of Java source files in layered packages.There is a
default binding rule and it is generally sufficient. In case, we need more
fine-tuned behaviour, we can supply such a binding schema also as an argument.
These source files are then compiled.
Using these classes, we can convert an XML document which is
based on the specified schema into corresponding java objects in a tree,
different from the usual DOM tree and more efficient. This process of
converting an XML document into Java objects is called Unmarshalling.
In the context of JAXB, a Java application is a
client application that uses the JAXB binding framework to unmarshal XML
data, validate and modify Java content objects, and marshal Java content
back to XML data.
---
To paraphrase from Sun's Documentation,
***
The general steps
in the JAXB data binding process are:
1. Generate classes. An XML schema is used
as input to the JAXB binding compiler to generate JAXB classes based on that
schema.
2. Compile classes. All of the generated
classes, source files, and application code must be compiled.
3. Unmarshal. XML documents written
according to the constraints in the source schema are unmarshalled by the JAXB
binding framework.
4. Generate content tree. The unmarshalling
process generates a content tree of data objects instantiated from the
generated JAXB classes; this content tree represents the structure and content
of the source XML documents.
5. Validate (optional). The unmarshalling
process optionally involves validation of the source XML documents before
generating the content tree.
6. Process
the content. The client application can modify the XML data
represented by the Java content tree by means of interfaces generated by the
binding compiler.
7. Marshal. The processed content tree is
marshalled out to one or more XML output documents. The content may be
validated before marshalling.
------------------------------------------------------------
The following code-snippet illustrates the process of unmarshalling.
( we are assuming an xml document named
'library'.)."<package-name>" refers to the package in which the
auto-genrated class files due to xjc command are available.
-------------------------------------------
JAXBContext context =
JAXBContext.newInstance("<package-name>")
;
Unmarshaller unmarshaller =
context.createUnmarshaller() ;
Library
library =
(Library)unmarshaller.unmarshal
(new
FileInputStream("library.xml")) ;
-------------------------------------------------------
library.xml is
an example XML document that conforms to the schema file from which the
JAXB-generated Java classes and interfaces are created, and Library is the root
object in the XML document. Hereafter, we can use java idiom to manipulate the objects in the
library.
-------------------------------------------
An application can directly create java
objects by using the ObjectFactory created by the xjc
process.First, we get an instance of ObjectFactory.This factory instance is
then used to create a library object.
We create objects in that library tree, set
attributes for such objects& add the objects to the root.Finally, an
instance of Marshaller class, is created and used to send the object to
xml file.
---------------------------------------
ObjectFactory factory=
new ObjectFactory();
Library
library = factory.createLibrary();
Book
book1 = factory.createBook();
book1.setTitle("java today");
book1.setPrice("200Rs");
library.add(book1);
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(library,
new FileOutputStream("library.xml")) ;
============================================
Thus, the process of converting a java-object
tree to xml is known as Marshalling.
To,
recapitulate,
Unmarshalling
means
creating a java object tree for an XML
document.
Marshalling means converting a javaobject tree into equivalent
XML.
==========================================
With these
introductory ideas, we take up a simple example in the next part of this
tutorial.
************************************************************
( PART-2)
============================================================
In the
second part of this tutorial on JAXB, the author gives a lab-oriented example
to demonstrate the practical method of using the JAXB API.Two demos , one for
Unmarshalling & the other for creating and marshalling , are given
--------------------------------------------
It is always very
important to learn a new concept , by hands-on-experimentation,after getting a
bird's eye view.So, we now take up a very simple example and see the step by
step procedure.
We are using jwsdp1.4 & jdk1.4.2
-----------------------------------
We have installed jwsdp1.4
in E: DRIVE.
& installed jdk1.4.2
also in E: DRIVE.
Our working folder is: g:\jaxbdemo
------------------------------------------
In this working folder (g:\jaxbdemo), let us first create a dtd
file , named , library.dtd, as follows:
--------------------------------
<?xml
version="1.0"
encoding="US-ASCII"
?>
<!ELEMENT
library
(fiction ,
biography ,science)>
<!ELEMENT
fiction (book)+>
<!ELEMENT biography
(book)+>
<!ELEMENT
science (book)+>
<!ELEMENT
book (#PCDATA)>
--------------------------------------------
The following file (g:\jaxbdemo\library.xml)
conforms to the above DTD.
-----------------------------------
<?xml version="1.0" ?>
<!DOCTYPE
library SYSTEM
"library.dtd">
<library>
<fiction>
<book>IVANHOE</book>
<book>DAVID COPPERFIELD</book>
<book>WAR AND PEACE</book>
</fiction>
<biography>
<book>LIFE OF GANDHI</book>
<book>ABRAHAM LINCOLN</book>
<book>MARX AND ENGELS</book>
</biography>
<science>
<book>MAN THE UNKNOWN</book>
<book>EXPANDING UNIVERSE</book>
<book>ORIGIN OF SPECIES</book>
</science>
</library>
-----------------------------------------
Documentation by SUN & a number of tutorials
in the web,
( cited as reference at the end of this tutorial)
assume that we are using ANT build file. It is desirable that any tutorial
illustrates the procedure without using ANT first, because understanding ANT
scripts ,is difficult for beginners. It is easier to understand the script
,after doing it the path/classpath way.This
will give us a clearer picture.
--------------------------------------
We begin by setting HOME as follows:
SET
JAVA_HOME=E:\JDK1.4.2
SET JWSDP_HOME=E:\JWSDP1.4
--------------------------------------------
In this window, we
give path as follows:
( one continuous line).
g:\jaxbdemo\setpath.bat
--------------------
c:\windows\command;
e:\jdk1.4.2\bin;
e:\jwsdp1.4\jaxb\bin;
e:\jwsdp1.4\jwsdp-shared\bin
********************************************
We find the following
files in:
e:\jwsdp1.4\jaxb\lib.
jaxb-api.jar
jaxb-impl.jar
jaxb-libs.jar
jaxb-xjc.jar
--------------------------------------
We have to set
classpath very carefully.
as , directed by
Sun's documentation.
So, we create a
batch file for this purpose.
Let us call this
batchfile 'setcpath.bat'
g:\jaxbdemo>edit
setcpath.bat
>set classpath=g:\jaxbdemo;
e:\jwsdp1.4\jaxb\lib\jaxb-api.jar;
e:\jwsdp1.4\jaxb\lib\jaxb-impl.jar;
e:\jwsdp1.4\jaxb\lib\jaxb-libs.jar;
e:\jwsdp1.4\jaxb\lib\jaxb-xjc.jar;
e:\jwsdp1.4\jswdp-shared\lib\namespace.jar;
e:\jwsdp1.4\jwsdp-shared\lib\jax-qname.jar;
e:\jwsdp1.4\jwsdp-shared\lib\xsdlib.jar
d:\jdk1.4\lib\tools.jar;
e:\jwsdp1.4\jwsdp-shared\lib\relaxngDatatype.jar
e:\jwsdp1.4\jaxp\lib\jaxp.jar
e:\jwsdp1.4\jaxp\lib\endorsed\dom.jar;
e:\jwsdp1.4\jaxp\lib\endorsed\sax.jar;
e:\jwsdp1.4\jaxp\lib\endorsed\xalan.jar;
e:\jwsdp1.4\jaxp\lib\endorsed\xercesImpl.jar;
( this
is as per Sun documentation given at the end of this file).
(all these typed
in a single line).
============================================
We set classpath
for our dos window by running the setcpath.bat file.
After this, we
run the following command:
g:\jaxbdemo>xjc -dtd
library.dtd
|
{we may get a message
that dom4j.jar is required and it should be placed in lib folder. dom4j is available
in jwsdp1.0\common\lib)So, we copy dom4j.jar from jwsdp1.0\common\lib to jwsdp1.4\jaxb\lib
folder). Run setcpath again. We can now run the
command without any problem. } ++++++++++++++++++++++++++++++ |
we
get the following display in the
console:
-----------------------------
parsing
a schema...
compiling
a schema...
generated\impl\runtime\UnmarshallingContext.java
generated\impl\runtime\SAXUnmarshallerHandler.java
generated\impl\runtime\PrefixCallback.java
generated\impl\runtime\Util.java
generated\impl\runtime\GrammarInfoFacade.java
generated\impl\runtime\UnmarshallerImpl.java
generated\impl\runtime\UnmarshallableObject.java
generated\impl\runtime\SAXMarshaller.java
generated\impl\runtime\ValidatableObject.java
generated\impl\runtime\ValidatingUnmarshaller.java
generated\impl\runtime\GrammarInfo.java
generated\impl\runtime\Discarder.java
generated\impl\runtime\SAXUnmarshallerHandlerImpl.java
generated\impl\runtime\InterningUnmarshallerHandler.java
generated\impl\runtime\MarshallerImpl.java
generated\impl\runtime\UnmarshallingEventHandler.java
generated\impl\runtime\ContentHandlerAdaptor.java
generated\impl\runtime\ErrorHandlerAdaptor.java
generated\impl\runtime\UnmarshallingEventHandlerAdaptor.java
generated\impl\runtime\NamespaceContextImpl.java
generated\impl\runtime\GrammarInfoImpl.java
generated\impl\runtime\NamespaceContext2.java
generated\impl\runtime\DefaultJAXBContextImpl.java
generated\impl\runtime\MSVValidator.java
generated\impl\runtime\AbstractUnmarshallingEventHandlerImpl.java
generated\impl\runtime\XMLSerializable.java
generated\impl\runtime\ValidatorImpl.java
generated\impl\runtime\XMLSerializer.java
generated\impl\runtime\ValidationContext.java
generated\impl\BiographyImpl.java
generated\impl\BookImpl.java
generated\impl\FictionImpl.java
generated\impl\JAXBVersion.java
generated\impl\LibraryImpl.java