The previous tutorial explain the Marshalling of Java Object to XML using JAXB Version 3.
There are tutorials about marshalling and unmarshalling XML using JAXB Version 2.
Marshalling – How to convert Java Objects to XML using JAXB
UnMarshalling- How to convert XML to Java Objects using JAXB
As of Java 11, JAXB is not part of the JRE anymore, and you need to configure the relevant libraries via your dependency management system, for example, either Maven or Gradle.
Configure the Java compiler level to be at least 11 and add the JAXB Version 3 dependencies to your pom file.
<!-- JAXB API v3.0.1 -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>3.0.1</version>
</dependency>
<!-- JAXB v3.0.2 reference implementation (curiously with com.sun coordinates) -->
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>3.0.2</version>
<scope>runtime</scope>
</dependency>
To know about the difference between JAXB Version 2 and JAXB Version3, refer this tutorial.
Sample XML Structure
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<EmployeeDetail>
<firstName>Terry</firstName>
<lastName>Mathew</lastName>
<age>30</age>
<salary>75000.0</salary>
<designation>Manager</designation>
<contactNumber>+919999988822</contactNumber>
<emailId>abc@test.com</emailId>
<gender>female</gender>
<maritalStatus>married</maritalStatus>
</EmployeeDetail>
Now, let us create the Java Objects (POJO) of above XML.
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "EmployeeDetail")
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee {
private String firstName;
private String lastName;
private int age;
private double salary;
private String designation;
private String contactNumber;
private String emailId;
private String gender;
private String maritalStatus;
public Employee() {
super();
}
// Getter and setter methods
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public String getDesignation() {
return designation;
}
public void setDesignation(String designation) {
this.designation = designation;
}
public String getContactNumber() {
return contactNumber;
}
public void setContactNumber(String contactNumber) {
this.contactNumber = contactNumber;
}
public String getEmailId() {
return emailId;
}
public void setEmailId(String emailId) {
this.emailId = emailId;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getMaritalStatus() {
return maritalStatus;
}
public void setMaritalStatus(String maritalStatus) {
this.maritalStatus = maritalStatus;
}
@Override
public String toString() {
return "Employee [FirstName=" + firstName + ", LastName=" + lastName + ", Age=" + age + ", Salary=" + salary
+ ", Designation=" + designation + ", ContactNumber=" + contactNumber + ", EmailId=" + emailId
+ ", Gender=" + gender + ", MaritalStatus=" + maritalStatus + "]";
}
}
Let’s create a simple program using the JAXBContext which provides an abstraction for managing the XML/Java binding information necessary to implement the JAXB binding framework operations and unmarshal.
import java.io.File;
import org.junit.Test;
import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Unmarshaller;
public class JAXBDeserialization {
@Test
public void JAXBUnmarshalTest() {
try {
String userDir = System.getProperty("user.dir");
File file = new File(userDir + "\\src\\test\\resources\\JAXB_XML.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Employee.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Employee employee = (Employee) jaxbUnmarshaller.unmarshal(file);
System.out.println(employee);
} catch (JAXBException e) {
e.printStackTrace();
}
}
When we run the code above, we may check the console output to verify that we have successfully converted XML data into a Java object:

This response is the result of the toString() method in POJO Class.
There is another way to get the values of each node of XML.
@Test
public void JAXBUnmarshalTest1() {
try {
String userDir = System.getProperty("user.dir");
File file = new File(userDir + "\\src\\test\\resources\\JAXB_XML.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Employee.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Employee employee = (Employee) jaxbUnmarshaller.unmarshal(file);
System.out.println("FirstName: " + employee.getFirstName());
System.out.println("LastName: " + employee.getLastName());
System.out.println("Age: " + employee.getAge());
System.out.println("Salary: " + employee.getSalary());
System.out.println("Contact Number: " + employee.getContactNumber());
System.out.println("Designation: " + employee.getDesignation());
System.out.println("Gender: " + employee.getGender());
System.out.println("EmailId: " + employee.getEmailId());
System.out.println("MaritalStatus: " + employee.getMaritalStatus());
} catch (JAXBException e) {
e.printStackTrace();
}
}
When we run the code above, we may check the console output to verify that we have successfully converted XML data into a Java object:

The Unmarshaller class governs the process of deserializing XML data into newly created Java content trees, optionally validating the XML data as it is unmarshalled. It provides overloading of unmarshal methods for many input kinds.
We are done! Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!!