JAXB Marshaller Example

The JAXB Marshaller interface is responsible for governing the process of serializing Java content trees i.e. Java objects to XML data. This marshalling to XML can be done to variety of output targets.

1. JAXB Marshalling Object to XML

1.1. Creating Marshaller

Generally, to create marshaller you can reuse this code.

JAXBContext jaxbContext 	= JAXBContext.newInstance( Employee.class );
Marshaller jaxbMarshaller 	= jaxbContext.createMarshaller();

Employee employeeObj = new Employee(1, "Lokesh", "Gupta", new Department(101, "IT"));

//Overloaded methods to marshal to different outputs
jaxbMarshaller.marshal(employeeObj);

1.2. Marshal to XML File

OutputStream os = new FileOutputStream( "employee.xml" );
jaxbMarshaller.marshal( employeeObj, os );

1.3. Marshal to SAX ContentHandler

Assume MyContentHandler is instance of org.xml.sax.ContentHandler.

jaxbMarshaller.marshal( employeeObj, new MyContentHandler() );

1.4. Marshal to DOM Document

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.newDocument();

jaxbMarshaller.marshal( employeeObj, doc );

1.5. Marshal and print to console

m.marshal( employeeObj, new PrintWriter( System.out ) );

2. JAXB Marshaller Properties

jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
//or
jaxbMarshaller.setProperty("jaxb.formatted.output", Boolean.TRUE);

All JAXB Providers are required to support the following set of properties. Some providers may support additional properties.

  • jaxb.encoding – The output encoding to use when marshalling the XML data. The Marshaller will use “UTF-8” by default if this property is not specified.
  • jaxb.formatted.output – Value can be true or false. Whether or not the Marshaller will format the resulting XML data with line breaks and indentation. Default value is false.
  • jaxb.schemaLocation – It allows the client application to specify an xsi:schemaLocation attribute in the generated XML data.
  • jaxb.noNamespaceSchemaLocation – It allows the client application to specify an xsi:noNamespaceSchemaLocation attribute in the generated XML data.
  • jaxb.fragment – It determines whether or not document level events will be generated by the Marshaller. Value can be true or false.

3. Marshaller Callback Methods

You can customize the marshalling operation by inside JAXB annotated class e.g. Employee.java. You need to define two methods which will listen before and after the marshaller process that class. In these methods, you can perform actions such as setting extra fields

package com.howtodoinjava.demo.model;

import java.io.Serializable;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "employee")
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Employee implements Serializable {

	private static final long serialVersionUID = 1L;

	private Integer id;
	private String firstName;
	private String lastName;
	private Department department;

	public Employee() {
		super();
	}

	//Setters and Getters

	@Override
	public String toString() {
		return "Employee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", department="
				+ department + "]";
	}

	// Invoked by Marshaller after it has created an instance of this object.
	boolean beforeMarshal(Marshaller marshaller) {
		System.out.println("Before Marshaller Callback");
		return true;
	}

	// Invoked by Marshaller after it has marshalled all properties of this object.
	void afterMarshal(Marshaller marshaller) {
		System.out.println("After Marshaller Callback");
	}
}

4. JAXB Marshalling Example

Example of marshalling Java Object to XML String.

package com.howtodoinjava.demo;

import java.io.StringWriter;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

import com.howtodoinjava.demo.model.Department;
import com.howtodoinjava.demo.model.Employee;

public class JaxbExample 
{
	public static void main(String[] args) 
	{
		Employee employee = new Employee(1, "Lokesh", "Gupta", new Department(101, "IT"));
		
		jaxbObjectToXML(employee);
	}

	private static void jaxbObjectToXML(Employee employee) 
	{
	    try {
	        JAXBContext jaxbContext = JAXBContext.newInstance(Employee.class);
	        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

	        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); // To format XML

	        //Print XML String to Console
	        jaxbMarshaller.marshal(employee, System.out);
	        
	    } catch (JAXBException e) {
	        e.printStackTrace();
	    }
	}
}

Program Output.

Before Marshaller Callback
After Marshaller Callback

<?xml version="1.0" encoding="UTF-8"?>
<employee>
   <department>
      <id>101</id>
      <name>IT</name>
   </department>
   <firstName>Lokesh</firstName>
   <id>1</id>
   <lastName>Gupta</lastName>
</employee>

Drop me your questions in comments section.

Happy Learning !!

Was this post helpful?

Join 7000+ Fellow Programmers

Subscribe to get new post notifications, industry updates, best practices, and much more. Directly into your inbox, for free.

2 thoughts on “JAXB Marshaller Example”

Leave a Comment

HowToDoInJava

A blog about Java and its related technologies, the best practices, algorithms, interview questions, scripting languages, and Python.