JAXB: Marshalling and Unmarshalling Example

Project Description

  • In this JAXB tutorial we will see an example on how to marshal and unmarshal Java objects.
  • This example explains how to,
    • map Java object’s property to XML element’s attribute using @XmlAttribute annotation,
    • map Java object’s property that references a class annotated with @XmlType as a child element to XML parent element.

Environment Used:

  • JDK 6.
  • Eclipse Indigo IDE for Java EE Developers.

New project in Eclipse

Create a new Java project in Eclipse IDE and name it as “SimpleJAXBDemo”.

Create Bean classes

Address.java

Create a new Class “Address.java” in the package “com.theopentutorials.jaxb.to” and copy the following code.

package com.theopentutorials.jaxb.to;

import javax.xml.bind.annotation.XmlType;

@XmlType
public class Address {
	private String street;
	private String city;
	private String state;
	private long zip;
	public String getStreet() {
		return street;
	}
	public void setStreet(String street) {
		this.street = street;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getState() {
		return state;
	}
	public void setState(String state) {
		this.state = state;
	}
	public long getZip() {
		return zip;
	}
	public void setZip(long zip) {
		this.zip = zip;
	}
	@Override
	public String toString() {
		return "Address [street=" + street + ", city=" + city + ", state="
				+ state + ", zip=" + zip + "]";
	}
}

This is a bean class which is embedded in parent class (Employee) to create a child element (<address> tag). This class is annotated with @javax.xml.bind.annotation.XmlType.

Employee.java

Create a new Class “Employee.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.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "employee")
public class Employee {

	@XmlAttribute
	private int id;
	private String name;
	private String department;
	private Address address;
	
	//Must have no-argument constructor
	public Employee() {	}
	
	public Employee(int id, String name, String department, Address address) {
		super();
		this.id = id;
		this.name = name;
		this.department = department;
		this.address = address;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getDepartment() {
		return department;
	}
	public void setDepartment(String department) {
		this.department = department;
	}
	public Address getAddress() {
		return address;
	}
	public void setAddress(Address address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "Employee [id=" + id + ", name=" + name + ", department="
				+ department + ", address=" + address + "]";
	}	
}

This is the root/parent class containing JAXB annotations whose object is marshalled and unmarshalled.

  • @XmlAccessorType specifies whether annotations are applied to fields or Javabean properties (getters and setters).
  • @XmlRootElement specifies the XML element.
  • @XmlAttribute specifies XML element’s attribute.

Create JAXB Handler (Helper class)

Create a new Class “JAXBXMLHandler.java” in the package “com.theopentutorials.jaxb.xml” and copy the following code.

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).

  • Marshalling is the process of writing Java objects to XML file.
  • Unmarshalling is the process of converting XML content to Java objects.
package com.theopentutorials.jaxb.xml;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import com.theopentutorials.jaxb.to.Employee;

public class JAXBXMLHandler {

	// Export: Marshalling
	public static void marshal(Employee employee, File selectedFile)
			throws IOException, JAXBException {
		JAXBContext context;
		BufferedWriter writer = null;
		writer = new BufferedWriter(new FileWriter(selectedFile));
		context = JAXBContext.newInstance(Employee.class);
		Marshaller m = context.createMarshaller();
		m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
		m.marshal(employee, writer);
		writer.close();
	}

	// Import: Unmarshalling
	public static Employee unmarshal(File importFile) throws JAXBException {
		Employee employee = null;
		JAXBContext context;

		context = JAXBContext.newInstance(Employee.class);
		Unmarshaller um = context.createUnmarshaller();
		employee = (Employee) um.unmarshal(importFile);

		return employee;
	}
}

Create Java Application client (main())

Create a new Class “JAXBDemo.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 javax.xml.bind.JAXBException;
import com.theopentutorials.jaxb.to.Address;
import com.theopentutorials.jaxb.to.Employee;
import com.theopentutorials.jaxb.xml.JAXBXMLHandler;

public class JAXBDemo {
	public static void main(String[] args) {

		Address address = new Address();
		address.setStreet("2163, 1st Avenue");
		address.setCity("Peoria");
		address.setState("Illinois");
		address.setZip(61606);
		
		Employee employee = new Employee(1, "Kumar", "Development", address);
		
		try {
			//Marshalling: Writing Java object to XML file
			JAXBXMLHandler.marshal(employee, new File("employee.xml"));
		
			//Unmarshalling: Converting XML content to Java objects
			Employee employee2 = JAXBXMLHandler.unmarshal(new File("employee.xml"));
			System.out.println(employee2);	
		} catch (IOException e) {
			e.printStackTrace();
		} catch (JAXBException e) {
			e.printStackTrace();
		}		
	}
}
  • This class creates employee object and calls marshal method from JAXBXMLHandler helper class passing the employee object and the file to write the generated xml.
  • We call unmarshal method passing the marshalled file name which returns employee object.
  • Finally, printing the employee object (which calls toString() from Employee class).

Output

Run the JAXBDemo.java.

Employee [id=1, name=Kumar, department=Development,
address=Address [street=2163, 1st Avenue, city=Peoria, state=Illinois, zip=61606]]

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"?>
<employee id="1">
    <name>Kumar</name>
    <department>Development</department>
    <address>
        <city>Peoria</city>
        <state>Illinois</state>
        <street>2163, 1st Avenue</street>
        <zip>61606</zip>
    </address>
</employee>

Folder Structure

The complete folder structure of this example is shown below.

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.