openplanning

Hướng dẫn và ví dụ Java JAXB

  1. Giới thiệu
  2. Tạo project
  3. Các cấu hình và kết quả

1. Giới thiệu

JAXB được tích hợp vào JDK bắt đầu từ phiên bản 6.0. Trong trường hợp bạn sử dụng Java các phiên bản trước bạn phải download và khai báo thư viện để sử dụng.
Tài liệu này hướng dẫn trên Java6, vì vậy bạn có thể sẵn sàng làm việc mà không cần download thư viện nào cả.
Mô hình ví dụ:
Đây là hình ảnh project sau khi hoàn thành.

2. Tạo project

Tạo một Project java thông thường.
Employee.java
package org.o7planning.tutorial.jaxb.model;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

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

   private String empNo;
   private String empName;
   private String managerNo;

   /**
    * Cấu tử mặc định này là bắt buộc nếu có thêm cấu tử khác.
    */
   public Employee() {

   }

   public Employee(String empNo, String empName, String managerNo) {
       this.empNo = empNo;
       this.empName = empName;
       this.managerNo = managerNo;
   }

   public String getEmpNo() {
       return empNo;
   }

   public void setEmpNo(String empNo) {
       this.empNo = empNo;
   }

   public String getEmpName() {
       return empName;
   }

   public void setEmpName(String empName) {
       this.empName = empName;
   }

   public String getManagerNo() {
       return managerNo;
   }

   public void setManager(String managerNo) {
       this.managerNo = managerNo;
   }

}
Department.java
package org.o7planning.tutorial.jaxb.model;

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(namespace = "http://o7planning.org/jaxb")
@XmlAccessorType(XmlAccessType.FIELD)
public class Department {

 private String deptNo;
 private String deptName;
 private String location;

 @XmlElementWrapper(name = "employees")
 @XmlElement(name = "employee")
 private List<Employee> employees;

 /**
  *  Cấu tử mặc định này là bắt buộc nếu có thêm cấu tử khác.
  */
 public Department() {

 }

 public Department(String deptNo, String deptName, String location) {
     this.deptNo = deptNo;
     this.deptName = deptName;
 }

 public String getDeptNo() {
     return deptNo;
 }

 public void setDeptNo(String deptNo) {
     this.deptNo = deptNo;
 }

 public String getDeptName() {
     return deptName;
 }

 public void setDeptName(String deptName) {
     this.deptName = deptName;
 }

 public String getLocation() {
     return location;
 }

 public void setLocation(String location) {
     this.location = location;
 }

 public List<Employee> getEmployees() {
     return employees;
 }

 public void setEmployees(List<Employee> employees) {
     this.employees = employees;
 }

}
TestExample.java
package org.o7planning.tutorial.jaxb.test;

import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

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

import org.o7planning.tutorial.jaxb.model.Department;
import org.o7planning.tutorial.jaxb.model.Employee;

public class TestExample {

   private static final String XML_FILE = "dept-info.xml";

   public static void main(String[] args) {

       Employee emp1 = new Employee("E01", "Tom", null);
       Employee emp2 = new Employee("E02", "Mary", "E01");
       Employee emp3 = new Employee("E03", "John", null);

       List<Employee> list = new ArrayList<Employee>();
       list.add(emp1);
       list.add(emp2);
       list.add(emp3);

       Department dept = new Department("D01", "ACCOUNTING", "NEW YORK");
       //
       dept.setEmployees(list);

       try {
           // Tạo đối tượng JAXB context.
           JAXBContext context = JAXBContext.newInstance(Department.class);

           // (1) Marshaller : Chuyển đối tượng Java thành XML
           Marshaller m = context.createMarshaller();
           m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

           // Ghi đối tượng java (dept) ra màn hình Console (System.out)
           m.marshal(dept, System.out);

           // Ghi đối tượng Java (dept) ra file.
           File outFile = new File(XML_FILE);
           m.marshal(dept, outFile);

           System.err.println("Write to file: " + outFile.getAbsolutePath());

           // (2) Unmarshaller : Chuyển dữ liệu XML thành đối tượng Java.
           Unmarshaller um = context.createUnmarshaller();

           // Phân tích file XML vừa được tạo ra ở bước trước.
           Department deptFromFile = (Department) um.unmarshal(new FileReader(
                   XML_FILE));
           List<Employee> emps = deptFromFile.getEmployees();
           for (Employee emp : emps) {
               System.out.println("Employee: " + emp.getEmpName());
           }

       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}
Kết quả khi chạy lớp TestExample.:
Hình ảnh dưới đây minh họa cách mà JAXB đã làm việc:

3. Các cấu hình và kết quả

Tiếp theo chúng ta sẽ thay đổi một số khai báo Annotation, và xem kết quả trong các tình huống này.