JAXB全称为Java Architecture for XML Binding,是Java EE平台提供的用于实现Java对象与XML文档相互映射的技术规范,它允许开发者通过注解配置的方式,直接将Java类的实例序列化为XML格式,也可以把XML数据反序列化为对应的Java对象,大幅降低了XML数据处理的复杂度。

JAXB的核心组件
在使用JAXB之前,需要先了解几个核心的类:
- JAXBContext:JAXB的上下文对象,是所有JAXB操作的入口,用于管理Java类和XML的映射关系。
- Marshaller:编组器,负责将Java对象转换为XML格式。
- Unmarshaller:反编组器,负责将XML数据转换为Java对象。
准备Java实体类
首先我们需要定义一个带有JAXB注解的Java实体类,这里以用户类为例,注解的作用是指定XML元素的名称、结构等映射规则:
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
// 指定该类的根节点名称为user
@XmlRootElement(name = "user")
public class User {
private String name;
private Integer age;
private String email;
// 指定XML中name子元素的映射
@XmlElement(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 指定XML中age子元素的映射
@XmlElement(name = "age")
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
// 指定XML中email子元素的映射
@XmlElement(name = "email")
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Java对象转XML的实现
接下来演示如何将User对象转换为XML字符串,步骤如下:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import java.io.StringWriter;
public class JavaToXmlDemo {
public static void main(String[] args) {
try {
// 1. 创建JAXBContext实例,传入需要转换的实体类
JAXBContext context = JAXBContext.newInstance(User.class);
// 2. 创建编组器Marshaller
Marshaller marshaller = context.createMarshaller();
// 3. 设置格式化输出,让生成的XML更易读
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// 4. 创建User对象并设置属性
User user = new User();
user.setName("张三");
user.setAge(25);
user.setEmail("test@ipipp.com");
// 5. 将对象转换为XML,输出到字符串
StringWriter writer = new StringWriter();
marshaller.marshal(user, writer);
String xmlResult = writer.toString();
System.out.println("生成的XML内容:");
System.out.println(xmlResult);
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行上述代码后,会输出如下格式的XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user>
<name>张三</name>
<age>25</age>
<email>test@ipipp.com</email>
</user>
XML转Java对象的实现
反过来,我们也可以把上面的XML字符串转换回User对象,实现步骤如下:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
public class XmlToJavaDemo {
public static void main(String[] args) {
try {
// 待转换的XML字符串
String xmlContent = "<?xml version="1.0" encoding="UTF-8" standalone="yes"?>n" +
"<user>n" +
" <name>张三</name>n" +
" <age>25</age>n" +
" <email>test@ipipp.com</email>n" +
"</user>";
// 1. 创建JAXBContext实例
JAXBContext context = JAXBContext.newInstance(User.class);
// 2. 创建反编组器Unmarshaller
Unmarshaller unmarshaller = context.createUnmarshaller();
// 3. 将XML字符串转换为User对象
StringReader reader = new StringReader(xmlContent);
User user = (User) unmarshaller.unmarshal(reader);
// 4. 输出对象属性验证结果
System.out.println("转换后的User对象属性:");
System.out.println("姓名:" + user.getName());
System.out.println("年龄:" + user.getAge());
System.out.println("邮箱:" + user.getEmail());
} catch (Exception e) {
e.printStackTrace();
}
}
}
常见问题说明
JDK版本兼容性
JAXB在JDK 8及之前是包含在JDK内置的rt.jar中的,从JDK 9开始,JAXB被移出了默认的类路径,需要单独引入依赖,Maven依赖如下:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.1</version>
</dependency>
复杂对象映射
如果Java对象中包含集合属性,比如用户有多个地址,我们可以使用<code>@XmlElementWrapper</code>注解来指定集合对应的XML包装节点,再配合<code>@XmlElement</code>指定集合内元素的名称,即可实现复杂结构的映射。