Hôm nay chúng ta sẽ cùng tìm hiểu ví dụ về jaxb2-maven-plugin XJC để tạo XSD từ Java Class. JAXB là công nghệ trung gian giữa Java Classes và XML. Chúng ta có thể dùng JAXB để tạo XML từ Java Object và ngược lại.

jaxb2-maven-plugin
XSD được dùng để định nghĩa cấu trúc dữ liệu hợp đồng, vì thế việc tạo các lớp Java đại diện cho XML schema không phải là cách làm phổ biến.
jaxb2-maven-plugin XJC là công cụ biên dịch JAXB Binding có thể dùng để tạo các lớp Java từ các tệp XSD, và trong bài này sẽ được sử dụng trong một dự án maven để minh họa cách tạo lớp Java từ XSD.
Trước tiên chúng ta phải tạo dự án maven, sau đó cần dùng plugin jaxb2-maven-plugin để tạo các lớp Java từ XSD.

Cấu trúc dự án sau khi build tạo file XSD
Dưới đây là tệp pom.xml cuối cùng:
<project xmlns="<https://maven.apache.org/POM/4.0.0>" xmlns:xsi="<https://www.w3.org/2001/XMLSchema-instance>"
xsi:schemaLocation="<https://maven.apache.org/POM/4.0.0> <https://maven.apache.org/xsd/maven-4.0.0.xsd>">
<modelVersion>4.0.0</modelVersion>
<groupId>jaxb-schemagen</groupId>
<artifactId>jaxb-schemagen</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.1</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>schemagen</id>
<goals>
<goal>schemagen</goal>
</goals>
</execution>
</executions>
<configuration>
<transformSchemas>
<transformSchema>
<uri><https://www.example.org/employee></uri>
<toPrefix>empns</toPrefix>
<toFile>employee.xsd</toFile>
</transformSchema>
<transformSchema>
<uri><https://www.example.org/address></uri>
<toPrefix>addrns</toPrefix>
<toFile>address.xsd</toFile>
</transformSchema>
</transformSchemas>
<includes>
<include>com/journaldev/bean/*</include>
</includes>
<verbose>true</verbose>
</configuration>
</plugin>
</plugins>
</build>
</project>
Một vài điểm cần chú ý là dependency jaxb, mục tiêu thực thi schemagen và cấu hình transformSchema. Trong đó, cấu hình transformSchema được dùng để chỉ định tên tệp XSD sẽ được tạo ra cùng với namespace prefix sẽ sử dụng trong tệp XSD.
Dưới đây là các lớp Java mà chúng ta sẽ dùng để tạo XSD. Ví dụ với Employee.java:
package com.journaldev.bean;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlType;
@XmlType(namespace = "<https://www.example.org/employee>")
public class Employee {
private String name;
private int id;
private String role;
private Address address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlAttribute
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
Lưu ý annotation @XmlType với namespace được sử dụng cho class và @XmlAttribute cho trường id. Class này sẽ tạo ra schema employee.xsd sau khi chúng ta build project. Như bạn thấy, nó có một trường Address là một class tùy chỉnh khác, nên chúng ta cũng cần annotate class này để việc tạo schema thành công.
Dưới đây là class Address với các annotation JAXB.
package com.journaldev.bean;
import javax.xml.bind.annotation.XmlType;
@XmlType(namespace = "<https://www.example.org/address>")
public class Address {
private String city;
private int zip;
private String addressLine1;
private String addressLine2;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public int getZip() {
return zip;
}
public void setZip(int zip) {
this.zip = zip;
}
public String getAddressLine1() {
return addressLine1;
}
public void setAddressLine1(String addressLine1) {
this.addressLine1 = addressLine1;
}
public String getAddressLine2() {
return addressLine2;
}
public void setAddressLine2(String addressLine2) {
this.addressLine2 = addressLine2;
}
}
Class này sẽ tạo ra address.xsd vì tên của nó được ánh xạ trong phần transformSchema trong file pom.xml. Sau khi cấu hình xong, chỉ cần build project bằng lệnh mvn clean install thì các tệp XSD sẽ được tạo ra.
Với project của tôi, các tệp tạo ra bao gồm:
employee.xsd
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="<https://www.w3.org/2001/XMLSchema>" xmlns:addrns="<https://www.example.org/address>" targetNamespace="<https://www.example.org/employee>" version="1.0">
<xs:import namespace="<https://www.example.org/address>" schemaLocation="address.xsd"/>
<xs:complexType name="employee">
<xs:sequence>
<xs:element minOccurs="0" name="address" type="ns1:address"/>
<xs:element minOccurs="0" name="name" type="xs:string"/>
<xs:element minOccurs="0" name="role" type="xs:string"/>
</xs:sequence>
<xs:attribute name="id" type="xs:int" use="required"/>
</xs:complexType>
</xs:schema>
address.xsd
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="<https://www.w3.org/2001/XMLSchema>" targetNamespace="<https://www.example.org/address>" version="1.0">
<xs:complexType name="address">
<xs:sequence>
<xs:element minOccurs="0" name="addressLine1" type="xs:string"/>
<xs:element minOccurs="0" name="addressLine2" type="xs:string"/>
<xs:element minOccurs="0" name="city" type="xs:string"/>
<xs:element name="zip" type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
Vậy là chúng ta đã hoàn tất việc tạo XSD từ các class Java. Cách làm này vừa đơn giản vừa hiệu quả để chuyển đổi từ Java class sang XSD.
Mong rằng hướng dẫn này sẽ hữu ích và dễ theo dõi với bạn.