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.
EclipseLink/Examples/MOXy/Spring/JAXBAnnotations
Contents
In order to use EclipseLink JAXB with the Spring Framework, you simply need a jaxb.properties
file and an eclipselink.jar
on the classpath. No other special configuration is required. This document will demonstrate how to configure Spring to use EclipseLink JAXB.
Configuration: applicationContext.xml
In Spring, beans are configured using the applicationContext.xml
file. The following XML file will be used to configure our beans:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> <property name="contextPath" value="example.gettingstarted"/> </bean> <bean id="xmlHelper" class="example.gettingstarted.XMLHelper"> <property name="marshaller" ref="jaxbMarshaller"/> </bean> </beans>
Two beans are being defined here:
- xmlHelper
- This is the class that will do all of the work, i.e. marshal and unmarshal
- We use the "marshaller" property to indicate that we want Spring to inject an instance of
org.springframework.oxm.jaxb.Jaxb2Marshaller
- jaxbMarshaller
- This is an instance of the
org.springframework.oxm.jaxb.Jaxb2Marshaller
class that will be injected into our xmlHelper bean - We use the "contextPath" property to indicate the location of the model classes,
jaxb.properties
, and anObjectFactory
class orjaxb.index
file
- This is an instance of the
Following is the jaxb.properties
file that tells Spring to use EclipseLink JAXB:
javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory
Bootstrapping the Application
The standard Spring bean lookup method can be used to gain access to the xmlHelper
bean:
// initialize IoC Container ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml"); // retrieve the XMLHelper instance from the Container XMLHelper xmlHelper = (XMLHelper) appContext.getBean("xmlHelper");
Example
Here is an example of EclipseLink JAXB used with the Spring Framework.
Requirements
The following are required to use EclipseLink JAXB with Spring.
EclipseLink
The latest version of EclipseLink can be found on the EclipseLink download page. eclipselink.jar
must be on the classpath.
Spring Framework
The latest version of the Spring Framework can be found on the Spring download page. The JAR files in the dist
folder of your Spring install as well as commons-logging.jar
found in /projects/spring-build/lib/ivy
must be on the classpath.
Model Classes
The following model classes make use of standard JAXB annotations as well as MOXy extensions:
Source/Config Files
This section contains the various source and configuration files for the example.
example.gettingstarted.XMLHelper.java
This is the class responsible for marshal/unmarshal operations:
package example.gettingstarted; import java.io.IOException; import javax.xml.transform.Result; import javax.xml.transform.Source; import org.springframework.oxm.XmlMappingException; import org.springframework.oxm.jaxb.Jaxb2Marshaller; public class XMLHelper { private Jaxb2Marshaller marshaller; /** * Unmarshal a given source */ public Object load(Source source) throws XmlMappingException, IOException { return marshaller.unmarshal(source); } /** * Marshal a given Object to a Result */ public void save(Object obj, Result result) throws XmlMappingException, IOException { marshaller.marshal(obj, result); } /** * This method is used by Spring to inject an instance of Jaxb2Marshaller */ public void setMarshaller(Jaxb2Marshaller marshaller) { this.marshaller = marshaller; } }
example.gettingstarted.XMLHelperTest.java
This class demonstrates how the XMLHelper bean can be acquired, and used to perform marshal/unmarshal operations on a Customer.
package example.gettingstarted; import java.io.FileInputStream; import java.io.FileOutputStream; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class XMLHelperTest { private static String APP_CTX = "applicationContext.xml"; private static String CUSTOMER_XML = "classes/customer.xml"; private XMLHelper xmlHelper; public static void main(String[] args) throws Exception { XMLHelperTest test = new XMLHelperTest(); test.setup(); test.testLoadAndSaveCustomer(); } public void setup() { // initialize IoC Container ApplicationContext appContext = new ClassPathXmlApplicationContext(APP_CTX); // retrieve the XMLHelper instance from the Container xmlHelper = (XMLHelper) appContext.getBean("xmlHelper"); } public void testLoadAndSaveCustomer() throws Exception { System.out.println("Beginning load and save Customer test."); // load Customer Customer customer = (Customer) xmlHelper.load(new StreamSource(new FileInputStream(CUSTOMER_XML))); if (customer == null) { System.out.println("Test failed!"); return; } // update Customer int newPhoneCount = customer.getPhoneNumbers().size() + 1; PhoneNumber pn = new PhoneNumber(); pn.setType("Additional"); pn.setValue("613-123-1234"); customer.getPhoneNumbers().add(pn); // save Customer xmlHelper.save(customer, new StreamResult(new FileOutputStream(CUSTOMER_XML))); // verify Customer was saved correctly, i.e. now has an additional phone number customer = (Customer) xmlHelper.load(new StreamSource(new FileInputStream(CUSTOMER_XML))); if (customer == null || customer.getPhoneNumbers().size() != newPhoneCount) { System.out.println("Test failed!"); return; } System.out.println("Test passed."); } }
customer.xml
This is a sample instance document.
<?xml version="1.0" encoding="UTF-8"?> <customer> <personal-info> <name>Jane Doe</name> </personal-info> <contact-info> <address> <city>My Town</city> <street>123 Any Street</street> </address> <phone-number type="work">613-555-1111</phone-number> <phone-number type="cell">613-555-2222</phone-number> </contact-info> </customer>