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.
Difference between revisions of "EclipseLink/Examples/MOXy/Spring/JAXBAnnotations"
(→Requirements) |
(→Requirements) |
||
Line 47: | Line 47: | ||
=== Requirements === | === Requirements === | ||
− | |||
* EclipseLink | * EclipseLink | ||
** The latest version of EclipseLink can be found on the [http://www.eclipse.org/eclipselink/downloads EclipseLink download] page. <code>eclipselink.jar</code> must be on the classpath. | ** The latest version of EclipseLink can be found on the [http://www.eclipse.org/eclipselink/downloads EclipseLink download] page. <code>eclipselink.jar</code> must be on the classpath. |
Revision as of 10:05, 28 July 2010
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
- EclipseLink
- The latest version of EclipseLink can be found on the EclipseLink download page.
eclipselink.jar
must be on the classpath.
- The latest version of EclipseLink can be found on the EclipseLink download page.
- 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 ascommons-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>