|
|
(22 intermediate revisions by the same user not shown) |
Line 1: |
Line 1: |
− | ==Overview== | + | == 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.: |
| + | * [[EclipseLink/Examples/MOXy/JAXB/Compiler | Generating a Java Model from an XML Schema]] |
| + | * [[EclipseLink/Examples/MOXy/JAXB/SpecifyRuntime | Specifying the EclipseLink MOXy JAXB Runtime]] |
| + | * [[EclipseLink/Examples/MOXy/JAXB/Runtime | Using JAXB to Manipulate XML]] |
| + | * [[EclipseLink/Examples/MOXy/JAXB/GenerateSchema | Generating an XML Schema from a Java Model]] |
| | | |
− | The following example will demonstrate how to use EclipseLink's JAXB functionality to:
| |
− | * Generate JAXB-annotated Java classes from an XML Schema using the JAXB Compiler
| |
− | * Unmarshal an XML Document
| |
− | * Modify the XML data using the interfaces generated by the compiler
| |
− | * Marshal the modified data to XML
| |
| | | |
− | ==Setup==
| + | ---- |
| | | |
− | # Ensure that you have EclipseLink correctly installed and configured for your environment. Please see [[EclipseLink/Installing and Configuring EclipseLink]] for more information.
| + | See the ''[http://www.eclipse.org/eclipselink/documentation/ Developing JAXB Applications Using EclipseLink MOXy]'' for complete 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]~
| + | |
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.: