Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "EclipseLink/Examples/MOXy/JAXB"

m (added xref to user guide)
(21 intermediate revisions by 4 users not shown)
Line 1: Line 1:
==Overview==
+
{{EclipseLink_DocWiki
 +
|link=EclipseLink/UserGuide/MOXy/Overview/JAXB}}
  
The following example will demonstrate how to use EclipseLink's JAXB functionality to:
+
==  Using EclipseLink MOXy JAXB ==
* Generate JAXB-annotated Java classes from an XML Schema using the JAXB Compiler
+
Java Architecture for XML Binding (JSR 222) is the standard for XML Binding in JavaJAXB covers 100% of XML Schema concepts. Learn how to use MOXy as your JAXB provider.:
* Unmarshal an XML Document
+
* [[EclipseLink/Examples/MOXy/JAXB/Compiler | Generating a Java Model from an XML Schema]]
* Modify the XML data using the interfaces generated by the compiler
+
* [[EclipseLink/Examples/MOXy/JAXB/SpecifyRuntime | Specifying the EclipseLink MOXy JAXB Runtime]]
* Marshal the modified data to XML
+
* [[EclipseLink/Examples/MOXy/JAXB/Runtime | Using JAXB to Manipulate XML]]
 
+
* [[EclipseLink/Examples/MOXy/JAXB/GenerateSchema | Generating an XML Schema from a Java Model]]
==Setup==
+
 
+
# Ensure that you have EclipseLink correctly installed and configured for your environmentPlease see [[EclipseLink/Installing and Configuring EclipseLink]] for more information.
+
# Ensure that you have ANT correctly installed and configured.
+
# Unzip the Example ZIP file to a new directory.
+
# Edit the <tt>env.properties</tt> file in the root directory of the example and specify the path to your EclipseLink <tt>jlib</tt> directory:
+
<source lang="xml">
+
...
+
# Edit eclipselink.jlib to point to your EclipseLink jlib directory
+
eclipselink.jlib=C:/EclipseLink-1.0/eclipselink/jlib
+
...
+
</source>
+
 
+
You can compile and run the Example at any time by typing <tt>ant</tt> from the Example directory. 
+
 
+
==Running the JAXB Compiler==
+
 
+
The JAXB compiler can be run to generate JAXB-annotated Java classes from an XML Schema:
+
 
+
<pre>
+
<ECLIPSELINK_HOME>/eclipselink/bin/jaxb-compiler.sh <source-file.xsd> [-options]
+
<ECLIPSELINK_HOME>\eclipselink\bin\jaxb-compiler.cmd <source-file.xsd> [-options]
+
 
+
Options include:
+
  -d <dir>                    Specifies the output directory for generated files
+
  -p <pkg>                    Specifies the target package
+
  -classpath <arg>            Specifies where to find user class files
+
  -verbose                    Enable verbose output
+
  -quiet                      Suppress compiler output
+
  -version                    Display version information
+
 
+
For a complete list of compiler options:
+
  jaxb-compiler.sh -help
+
 
+
Example:
+
  jaxb-compiler.sh -d jaxb-compiler-output config/Customer.xsd
+
</pre>
+
 
+
In this example, the JAXB Compiler is run from the "<tt>run.jaxb.compiler</tt>" task in the ANT build file.
+
 
+
==Creating a JAXBContext using jaxb.properties==
+
 
+
The standard way to specify which JAXB implementation should be used is through a file called <tt>jaxb.properties</tt>, which contains a single property, <tt>javax.xml.bind.context.factory</tt>. This file must be available on the classpath in the corresponding package (in this example, "<tt>org.example.customer_example</tt>").  To specify that the EclipseLink JAXB implementation should be used, your <tt>jaxb.properties</tt> file should have the following content:
+
 
+
<source lang="java">
+
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
+
</source>
+
 
+
In our example, we create the JAXBContext as follows:
+
 
+
<source lang="java">
+
JAXBContext jaxbContext = JAXBContext.newInstance("org.example.customer_example");
+
</source>
+
 
+
An alternate way to create a new JAXBContext is to supply an array of Class objects.  Again, the <tt>jaxb.properties</tt> file must be available on the classpath in the corresponding package:
+
 
+
<source lang="java">
+
Class[] classes = new Class[4];
+
classes[0] = org.example.customer_example.AddressType.class;
+
classes[1] = org.example.customer_example.ContactInfo.class;
+
classes[2] = org.example.customer_example.CustomerType.class;
+
classes[3] = org.example.customer_example.PhoneNumber.class;
+
JAXBContext jaxbContext = JAXBContext.newInstance(classes);
+
</source>
+
 
+
==Unmarshalling the XML Document==
+
 
+
With a JAXBContext created, we can now unmarshal an XML document using the statically generated classes:
+
 
+
<source lang="java">
+
File file = new File("Customer-data.xml");
+
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+
StreamSource source = new StreamSource(file);
+
JAXBElement customerElement = unmarshaller.unmarshal(source, CustomerType.class);
+
CustomerType customer = (CustomerType) customerElement.getValue();
+
</source>
+
 
+
==Modify the Objects==
+
 
+
Below are examples of manipulating the XML data using the JAXB-generated static classes. Note that there are JavaBean-type accessors on the static interfaces.
+
 
+
Modifying the <tt>ShippingAddress</tt> <tt>ZipCode</tt> :
+
 
+
<source lang="java">
+
customer.getContactInfo().getShippingAddress().setZipCode("27601");
+
</source>
+
 
+
Adding a new <tt>PhoneNumber</tt> :
+
 
+
<source lang="java">
+
PhoneNumber homePhoneNumber  = new ObjectFactory().createPhoneNumber();
+
homePhoneNumber.setType("home");
+
homePhoneNumber.setValue("(613) 555-3333");
+
customer.getContactInfo().getPhoneNumber().add(homePhoneNumber);
+
</source>
+
 
+
Note the use of the <tt>ObjectFactory</tt> class to create a new <tt>PhoneNumber</tt> object.  In addition to generating the model classes used in this example, the JAXB compiler also generates an <tt>ObjectFactory</tt> class that can be used to create any of the generated types.
+
 
+
Removing all "cell" <tt>PhoneNumbers</tt> :
+
 
+
<source lang="java">
+
ArrayList phoneNumbersToRemove = new ArrayList();
+
List phoneNumbers = customer.getContactInfo().getPhoneNumber();
+
Iterator it = phoneNumbers.iterator();
+
while (it.hasNext()) {
+
    PhoneNumber phoneNumber = (PhoneNumber) it.next();
+
    if (phoneNumber.getType().equals("cell")) {
+
        phoneNumbersToRemove.add(phoneNumber);
+
    }
+
}
+
phoneNumbers.removeAll(phoneNumbersToRemove);
+
</source>
+
 
+
==Download==
+
 
+
[ xxx ]
+
 
+
~[#Top]~
+

Revision as of 10:07, 4 January 2011

Using EclipseLink MOXy JAXB

Java Architecture for XML Binding (JSR 222) is the standard for XML Binding in Java. JAXB covers 100% of XML Schema concepts. Learn how to use MOXy as your JAXB provider.:

Back to the top