Project Description
- In the example provided here, we saw how to marshal and unmarshal CDATA block using JAXB RI by creating custom adapter class.
- In this JAXB example we will see how to marshal and unmarshal CDATA block using MOXy implementation which is available as part of Eclipselink project.
- When using MOXy JAXB implementation there is no need to write custom adapter. Just an annotation (provided by MOXy) is sufficient to handle CDATA.
Environment Used:
- JDK 6 (Java SE 6) or later.
- Eclipse Indigo IDE for Java EE Developers.
- EclipseLink 2.3.2 (Download EclipseLink from here and extract the zip file). We need this for MOXy which is an implementation of JAXB API.
New project in Eclipse
Create a new Java project in Eclipse IDE and name it as JAXBCDataMoxyImpl.
Add JAR file
- You need to add eclipselink.jar file located in “eclipselink/jlib” in your project Build Path.
- Right click on project -> Properties -> Java Build Path from left pane -> Libraries from right pane -> Add External JARs…
Create Bean class
Create a new Class “Book.java” in the package “com.theopentutorials.jaxb.to” and copy the following code.
package com.theopentutorials.jaxb.to; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; import org.eclipse.persistence.oxm.annotations.XmlCDATA; @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "book") public class Book { private String name; private String author; private String publisher; private String isbn; @XmlCDATA private String description; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getPublisher() { return publisher; } public void setPublisher(String publisher) { this.publisher = publisher; } public String getIsbn() { return isbn; } public void setIsbn(String isbn) { this.isbn = isbn; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } @Override public String toString() { return "Book [name=" + name + ", author=" + author + ", publisher=" + publisher + ", isbn=" + isbn + ", description=" + description + "]"; } }
This is a simple bean class containing JAXB annotations whose object is marshalled and unmarshalled. The ‘description’ property is annotated with @XmlCDATA which is provided by MOXy and vendor specific.
jaxb.properties file
To use MOXy as your JAXB implementation you need to add a jaxb.properties file in the bean package.
Create a new file “jaxb.properties” in the package “com.theopentutorials.jaxb.to” and copy the following entry.
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Create JAXB Handler (Helper class)
Create a new Class “JAXBXMLHandler.java” in the package “com.theopentutorials.jaxb.xml” and copy the following code.
package com.theopentutorials.jaxb.xml; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Map; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import javax.xml.transform.stream.StreamSource; import com.theopentutorials.jaxb.to.Book; public class JAXBXMLHandler { public static Book unmarshal(File importFile) throws JAXBException { Book book = new Book(); JAXBContext context; context = JAXBContext.newInstance(Book.class); Unmarshaller um = context.createUnmarshaller(); book = (Book) um.unmarshal(importFile); return book; } public static void marshal(Book book, Class[] classes, Map<String, Map<String, StreamSource>> properties, File selectedFile) throws IOException, JAXBException { JAXBContext context; BufferedWriter writer = null; try { writer = new BufferedWriter(new FileWriter(selectedFile)); context = JAXBContext.newInstance(classes, properties); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); m.marshal(book, writer); } finally { try { writer.close(); } catch (IOException io) {/* ignore */ } } } }
- This is a helper class which has methods to perform marshalling and unmarshalling. These methods are called from client code (in this case, main() method).
- By default, the marshaller implementation of the JAXB RI tries to escape characters.
- We use an overloaded JAXBContext.newInstance(Class) to configure ‘properties’ for this instantiation of JAXBContext. The interpretation of properties is implementation specific.
MOXy binding file
MOXy JAXB implementation allows you to enable a element to use CDATA. You could use MOXy’s binding file to indicate that the book’s ‘description’ property should use CDATA.
Create a XML file in your project and name it as “oxm.xml” and copy the following code.
<?xml version="1.0" encoding="UTF-8"?> <xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"> <java-types> <java-type name="com.theopentutorials.jaxb.to.Book"> <java-attributes> <xml-element java-attribute="description" cdata="true"/> </java-attributes> </java-type> </java-types> </xml-bindings>
Create Java Application client (main())
Create a new Class “JAXBCDataDemo.java” in the package “com.theopentutorials.jaxb.main” and copy the following code.
package com.theopentutorials.jaxb.main; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.xml.bind.JAXBException; import javax.xml.transform.stream.StreamSource; import com.theopentutorials.jaxb.to.Book; import com.theopentutorials.jaxb.xml.JAXBXMLHandler; public class JAXBCDataDemo { public static void main(String[] args) { Book book = new Book(); book.setAuthor("Kathy Sierra"); book.setName("SCJP"); book.setPublisher("Tata McGraw Hill"); book.setIsbn("856-545456736"); String desc = "<p>With hundreds of practice questions and hands-on exercises, " + "<b>SCJP Sun Certified Programmer for Java 6 Study Guide</b>" + "covers what you need to know" + "--and shows you how to prepare--" + "for this challenging exam. </p>"; book.setDescription(desc); Map<String, StreamSource> oxm = new HashMap<String, StreamSource>(1); oxm.put("com.theopentutorials.jaxb.to", new StreamSource("oxm.xml")); Map<String, Map<String, StreamSource>> properties = new HashMap<String, Map<String, StreamSource>>(); properties.put("eclipselink-oxm-xml", oxm); Class[] classes = { Book.class }; try { //Marshalling: Writing Java object to XML file JAXBXMLHandler.marshal(book, classes, properties, new File("book.xml")); //Unmarshalling: Converting XML content to Java objects Book book2 = JAXBXMLHandler.unmarshal(new File("book.xml")); System.out.println("Unmarshal: " + book2); } catch (IOException e) { e.printStackTrace(); } catch (JAXBException e) { e.printStackTrace(); } } }
- This class creates book object with ‘description’ property containing HTML tags and calls marshal method from JAXBXMLHandler helper class passing book object and the file to write the object.
- We call unmarshal method passing the marshalled file name which returns a book object.
- Finally, printing the book object (which calls toString() from Book class).
Output
Run the JAXBCDataDemo.java.
Book [name=SCJP, author=Kathy Sierra, publisher=Tata McGraw Hill, isbn=856-545456736, description=
<p>With hundreds of practice questions and hands-on exercises, <b>SCJP Sun Certified Programmer for Java 6 Study Guide</b> covers what you need to know–and shows you how to prepare–for this challenging exam. </p>]
Refresh your project in Project Explorer (press F5 on your project) to see the generated XML file.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <book> <name>SCJP</name> <author>Kathy Sierra</author> <publisher>Tata McGraw Hill</publisher> <isbn>856-545456736</isbn> <description><![CDATA[<p>With hundreds of practice questions and hands-on exercises, <b>SCJP Sun Certified Programmer for Java 6 Study Guide</b> covers what you need to know-- and shows you how to prepare --for this challenging exam. </p>]]> </description> </book>
Folder Structure
The complete folder structure of this example is shown below.