Basic Examples
This section describes five basic examples (Unmarshal Read, Modify Marshal, Create Marshal, Unmarshal Validate, Validate-On-Demand) that demonstrate how to:
- Unmarshal an XML document into a Java content tree and access the data contained within it
- Modify a Java content tree
- Use the
ObjectFactoryclass to create a Java content tree from scratch and then marshal it to XML data- Perform validation during unmarshalling
- Validate a Java content tree at runtime
Unmarshal Read Example
The purpose of the Unmarshal Read example is to demonstrate how to unmarshal an XML document into a Java content tree and access the data contained within it.
- The
<JWSDP_HOME>/jaxb/samples/unmarshal-read/class declares imports for four standard Java classes plus three JAXB binding framework classes and the
Main.javaprimer.popackage:
import java.io.FileInputStream
import java.io.IOException
import java.util.Iterator
import java.util.List
import javax.xml.bind.JAXBContext
import javax.xml.bind.JAXBException
import javax.xml.bind.Unmarshaller
import primer.po.*;- A
JAXBContextinstance is created for handling classes generated inprimer.po.
JAXBContext jc = JAXBContext.newInstance( "primer.po" );- An
Unmarshallerinstance is created.
Unmarshaller u = jc.createUnmarshaller();po.xmlis unmarshalled into a Java content tree comprising objects generated by the JAXB binding compiler into theprimer.popackage.
PurchaseOrder po =
(PurchaseOrder)u.unmarshal(
new FileInputStream( "po.xml" ) );- A simple string is printed to
system.outto provide a heading for the purchase order invoice.
System.out.println( "Ship the following items to: " );getanddisplaymethods are used to parse XML content in preparation for output.
USAddress address = po.getShipTo();
displayAddress(address);
Items items = po.getItems();
displayItems(items);- Basic error handling is implemented.
} catch( JAXBException je ) {
je.printStackTrace();
} catch( IOException ioe ) {
ioe.printStackTrace();- The
USAddressbranch of the Java tree is walked, and address information is printed tosystem.out.
public static void displayAddress( USAddress address ) {
// display the address
System.out.println( "\t" + address.getName() );
System.out.println( "\t" + address.getStreet() );
System.out.println( "\t" + address.getCity() +
", " + address.getState() +
" " + address.getZip() );
System.out.println( "\t" + address.getCountry() + "\n");
}- The
Itemslist branch is walked, and item information is printed tosystem.out.
public static void displayItems( Items items ) {
// the items object contains a List of
//primer.po.ItemType objects
List itemTypeList = items.getItem();- Walking of the
Itemsbranch is iterated until all items have been printed.
for(Iterator iter = itemTypeList.iterator();
iter.hasNext();) {
Items.ItemType item = (Items.ItemType)iter.next();
System.out.println( "\t" + item.getQuantity() +
" copies of \"" + item.getProductName() +
"\"" );
}Sample Output
Running
java Mainfor this example produces the following output:Ship the following items to: Alice Smith 123 Maple Street Cambridge, MA 12345 US 5 copies of "Nosferatu - Special Edition (1929)" 3 copies of "The Mummy (1959)" 3 copies of "Godzilla and Mothra: Battle for Earth/Godzilla vs. King Ghidora"Modify Marshal Example
The purpose of the Modify Marshal example is to demonstrate how to modify a Java content tree.
- The
<JWSDP_HOME>/jaxb/samples/modify-marshal/class declares imports for three standard Java classes plus four JAXB binding framework classes and
Main.javaprimer.popackage:
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigDecimal;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import primer.po.*;- A
JAXBContextinstance is created for handling classes generated inprimer.po.
JAXBContext jc = JAXBContext.newInstance( "primer.po" );- An
Unmarshallerinstance is created, andpo.xmlis unmarshalled.
Unmarshaller u = jc.createUnmarshaller();
PurchaseOrder po =
(PurchaseOrder)u.unmarshal(
new FileInputStream( "po.xml" ) );setmethods are used to modify information in theaddressbranch of the content tree.
USAddress address = po.getBillTo();
address.setName( "John Bob" );
address.setStreet( "242 Main Street" );
address.setCity( "Beverly Hills" );
address.setState( "CA" );
address.setZip( new BigDecimal( "90210" ) );- A
Marshallerinstance is created, and the updated XML content is marshalled tosystem.out. ThesetPropertyAPI is used to specify output encoding; in this case formatted (human readable) XML format.
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.TRUE);
m.marshal( po, System.out );Sample Output
Running
java Mainfor this example produces the following output:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <purchaseOrder orderDate="1999-10-20-05:00"> <shipTo country="US"> <name>Alice Smith</name> <street>123 Maple Street</street> <city>Cambridge</city> <state>MA</state> <zip>12345</zip> </shipTo> <billTo country="US"> <name>John Bob</name> <street>242 Main Street</street> <city>Beverly Hills</city> <state>CA</state> <zip>90210</zip> </billTo> <items> <item partNum="242-NO"> <productName>Nosferatu - Special Edition (1929)</productName> <quantity>5</quantity> <USPrice>19.99</USPrice> </item> <item partNum="242-MU"> <productName>The Mummy (1959)</productName> <quantity>3</quantity> <USPrice>19.98</USPrice> </item> <item partNum="242-GZ"> <productName> Godzilla and Mothra: Battle for Earth/Godzilla vs. King Ghidora </productName> <quantity>3</quantity> <USPrice>27.95</USPrice> </item> </items> </purchaseOrder>Create Marshal Example
The Create Marshal example demonstrates how to use the
ObjectFactoryclass to create a Java content tree from scratch and then marshal it to XML data.
- The
<JWSDP_HOME>/jaxb/samples/create-marshal/class declares imports for four standard Java classes plus three JAXB binding framework classes and the
Main.javaprimer.popackage:
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Calendar;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import primer.po.*;- A
JAXBContextinstance is created for handling classes generated inprimer.po.
JAXBContext jc = JAXBContext.newInstance( "primer.po" );- The
ObjectFactoryclass is used to instantiate a new emptyPurchaseOrderobject.
// creating the ObjectFactory
ObjectFactory objFactory = new ObjectFactory();
// create an empty PurchaseOrder
PurchaseOrder po = objFactory.createPurchaseOrder();- Per the constraints in the
po.xsdschema, thePurchaseOrderobject requires a value for theorderDateattribute. To satisfy this constraint, theorderDateis set using the standardCalendar.getInstance()method fromjava.util.Calendar.
po.setOrderDate( Calendar.getInstance() );- The
ObjectFactoryis used to instantiate new emptyUSAddressobjects, and the required attributes are set.
USAddress shipTo = createUSAddress( "Alice Smith",
"123 Maple Street",
"Cambridge",
"MA",
"12345" );
po.setShipTo( shipTo );
USAddress billTo = createUSAddress( "Robert Smith",
"8 Oak Avenue",
"Cambridge",
"MA",
"12345" );
po.setBillTo( billTo );- The
ObjectFactoryclass is used to instantiate a new emptyItemsobject.
Items items = objFactory.createItems();- A
getmethod is used to get a reference to theItemTypelist.
List itemList = items.getItem();ItemTypeobjects are created and added to theItemslist.
itemList.add( createItemType(
"Nosferatu - Special Edition (1929)",
new BigInteger( "5" ),
new BigDecimal( "19.99" ),
null,
null,
"242-NO" ) );
itemList.add( createItemType( "The Mummy (1959)",
new BigInteger( "3" ),
new BigDecimal( "19.98" ),
null,
null,
"242-MU" ) );
itemList.add( createItemType(
"Godzilla and Mothra: Battle for Earth/Godzilla
vs. King Ghidora",
new BigInteger( "3" ),
new BigDecimal( "27.95" ),
null,
null,
"242-GZ" ) );- The
itemsobject now contains a list ofItemTypeobjects and can be added to thepoobject.
po.setItems( items );- A
Marshallerinstance is created, and the updated XML content is marshalled tosystem.out. ThesetPropertyAPI is used to specify output encoding; in this case formatted (human readable) XML format.
Marshaller m = jc.createMarshaller();
m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.TRUE );
m.marshal( po, System.out );- An empty
USAddressobject is created and its properties set to comply with the schema constraints.
public static USAddress createUSAddress(
ObjectFactory objFactory,
String name, String street,
String city,
String state,
String zip )
throws JAXBException {
// create an empty USAddress objects
USAddress address = objFactory.createUSAddress();
// set properties on it
address.setName( name );
address.setStreet( street );
address.setCity( city );
address.setState( state );
address.setZip( new BigDecimal( zip ) );
// return it
return address;
}- Similar to the previous step, an empty
ItemTypeobject is created and its properties set to comply with the schema constraints.
public static Items.ItemType createItemType(ObjectFactory
objFactory,
String productName,
BigInteger quantity,
BigDecimal price,
String comment,
Calendar shipDate,
String partNum )
throws JAXBException {
// create an empty ItemType object
Items.ItemType itemType =
objFactory.createItemsItemType();
// set properties on it
itemType.setProductName( productName );
itemType.setQuantity( quantity );
itemType.setUSPrice( price );
itemType.setComment( comment );
itemType.setShipDate( shipDate );
itemType.setPartNum( partNum );
// return it
return itemType;
}Sample Output
Running
java Mainfor this example produces the following output:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <purchaseOrder orderDate="2002-09-24-05:00"> <shipTo> <name>Alice Smith</name> <street>123 Maple Street</street> <city>Cambridge</city> <state>MA</state> <zip>12345</zip> </shipTo> <billTo> <name>Robert Smith</name> <street>8 Oak Avenue</street> <city>Cambridge</city> <state>MA</state> <zip>12345</zip> </billTo> <items> <item partNum="242-NO"> <productName>Nosferatu - Special Edition (1929)</productName> <quantity>5</quantity <USPrice>19.99</USPrice> </item> <item partNum="242-MU"> <productName>The Mummy (1959)</productName> <quantity>3</quantity> <USPrice>19.98</USPrice> </item> <item partNum="242-GZ"> <productName>Godzilla and Mothra: Battle for Earth/Godzilla vs. King Ghidora</productName> <quantity>3</quantity> <USPrice>27.95</USPrice> </item> </items> </purchaseOrder>Unmarshal Validate Example
The Unmarshal Validate example demonstrates how to enable validation during unmarshalling (Unmarshal-Time Validation). Note that JAXB provides functions for validation during unmarshalling but not during marshalling. Validation is explained in more detail in More About Validation.
- The
<JWSDP_HOME>/jaxb/samples/unmarshal-validate/Main.java
class declares imports for three standard Java classes plus seven JAXB binding framework classes and theprimer.popackage:
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigDecimal;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.UnmarshalException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.ValidationEvent;
import javax.xml.bind.util.ValidationEventCollector;
import primer.po.*;- A
JAXBContextinstance is created for handling classes generated inprimer.po.
JAXBContext jc = JAXBContext.newInstance( "primer.po" );- An
Unmarshallerinstance is created.
Unmarshaller u = jc.createUnmarshaller();- The default JAXB Unmarshaller
ValidationEventHandleris enabled to send to validation warnings and errors tosystem.out. The default configuration causes the unmarshal operation to fail upon encountering the first validation error.
u.setValidating( true );- An attempt is made to unmarshal
po.xmlinto a Java content tree. For the purposes of this example, thepo.xmlcontains a deliberate error.
PurchaseOrder po =
(PurchaseOrder)u.unmarshal(
new FileInputStream("po.xml"));- The default validation event handler processes a validation error, generates output to
system.out, and then an exception is thrown.
} catch( UnmarshalException ue ) {
System.out.println( "Caught UnmarshalException" );
} catch( JAXBException je ) {
je.printStackTrace();
} catch( IOException ioe ) {
ioe.printStackTrace();Sample Output
Running
java Mainfor this example produces the following output:DefaultValidationEventHandler: [ERROR]: "-1" does not satisfy the "positiveInteger" type Caught UnmarshalExceptionValidate-On-Demand Example
The Validate-On-Demand example demonstrates how to validate a Java content tree at runtime (On-Demand Validation). At any point, client applications can call the
Validator.validatemethod on the Java content tree (or any subtree of it). All JAXB Providers are required to support this operation. Validation is explained in more detail in More About Validation.
- The
<JWSDP_HOME>/jaxb/samples/ondemand-validate/Main.java
class declares imports for five standard Java classes plus nine JAXB Java classes and theprimer.popackage:
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.UnmarshalException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.ValidationEvent;
import javax.xml.bind.ValidationException;
import javax.xml.bind.Validator;
import javax.xml.bind.util.ValidationEventCollector;
import primer.po.*;- A
JAXBContextinstance is created for handling classes generated inprimer.po.
JAXBContext jc = JAXBContext.newInstance( "primer.po" );- An
Unmarshallerinstance is created, and a validpo.xmldocument is unmarshalled into a Java content tree. Note thatpo.xmlis valid at this point; invalid data will be added later in this example.
Unmarshaller u = jc.createUnmarshaller();
PurchaseOrder po =
(PurchaseOrder)u.unmarshal( new FileInputStream( "po.xml" ) );- A reference is obtained for the first item in the purchase order.
Items items = po.getItems();
List itemTypeList = items.getItem();
Items.ItemType item = (Items.ItemType)itemTypeList.get( 0 );- Next, the item quantity is set to an invalid number. When validation is enabled later in this example, this invalid quantity will throw an exception.
item.setQuantity( new BigInteger( "-5" ) );
Note: If
@enableFailFastCheckwas"true"and the optionalFailFastvalidation method was supported by an implementation, aTypeConstraintExceptionwould be thrown here. Note that the JAXB implementation does not support theFailFastfeature. Refer to the JAXB Specification for more information aboutFailFastvalidation.
- A
Validatorinstance is created, and the content tree is validated. Note that theValidatorclass is responsible for managing On-Demand validation, whereas theUnmarshallerclass is responsible for managing Unmarshal-Time validation during unmarshal operations.
Validator v = jc.createValidator();
boolean valid = v.validateRoot( po );
System.out.println( valid );- The default validation event handler processes a validation error, generates output to
system.out, and then an exception is thrown.
} catch( ValidationException ue ) {
System.out.println( "Caught ValidationException" );
} catch( JAXBException je ) {
je.printStackTrace();
} catch( IOException ioe ) {
ioe.printStackTrace();
}Sample Output
Running
java Mainfor this example produces the following output: