JAXB是Java Architecture for XML Binding的缩写,是Java SE中内置的用于实现XML和Java对象互相映射转换的规范,通过注解配置即可完成两者的自动转换,大大降低了XML处理的复杂度。

JAXB核心注解说明
使用JAXB进行转换前,需要先通过注解定义Java类和XML元素的映射关系,常用的注解如下:
- @XmlRootElement:标注在类上,指定该类对应XML的根元素
- @XmlElement:标注在字段或getter方法上,指定字段对应XML的子元素
- @XmlAttribute:标注在字段或getter方法上,指定字段对应XML元素的属性
- @XmlElementWrapper:标注在集合字段上,为集合元素添加外层包装元素
定义映射的Java实体类
首先定义一个用户类,通过JAXB注解配置和XML的映射关系:
import javax.xml.bind.annotation.*;
import java.util.List;
// 根元素名称为user
@XmlRootElement(name = "user")
@XmlAccessorType(XmlAccessType.FIELD)
public class User {
// 对应XML中user元素的id属性
@XmlAttribute
private Integer id;
// 对应XML中的name子元素
@XmlElement
private String name;
// 对应XML中的age子元素
@XmlElement
private Integer age;
// 对应XML中的hobbies子元素下的hobby子元素集合
@XmlElementWrapper(name = "hobbies")
@XmlElement(name = "hobby")
private List<String> hobbies;
// 必须提供无参构造器,JAXB转换时需要反射实例化对象
public User() {
}
public User(Integer id, String name, Integer age, List<String> hobbies) {
this.id = id;
this.name = name;
this.age = age;
this.hobbies = hobbies;
}
// getter和setter方法省略
}
Java对象转换为XML
通过JAXBContext创建上下文,再使用Marshaller类即可将Java对象序列化为XML字符串或输出到文件:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import java.io.File;
import java.io.StringWriter;
import java.util.Arrays;
public class JavaToXmlDemo {
public static void main(String[] args) throws Exception {
// 创建测试用户对象
User user = new User(1, "张三", 25, Arrays.asList("篮球", "阅读", "编程"));
// 创建JAXB上下文,指定要转换的类
JAXBContext context = JAXBContext.newInstance(User.class);
// 创建序列化器
Marshaller marshaller = context.createMarshaller();
// 设置格式化输出,生成的XML会有缩进
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// 设置编码格式
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
// 方式1:转换为XML字符串
StringWriter writer = new StringWriter();
marshaller.marshal(user, writer);
String xmlStr = writer.toString();
System.out.println("转换后的XML字符串:n" + xmlStr);
// 方式2:输出到XML文件
marshaller.marshal(user, new File("user.xml"));
}
}
运行上述代码后,生成的XML内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user id="1">
<name>张三</name>
<age>25</age>
<hobbies>
<hobby>篮球</hobby>
<hobby>阅读</hobby>
<hobby>编程</hobby>
</hobbies>
</user>
XML转换为Java对象
使用Unmarshaller类可以将XML字符串或文件反序列化为Java对象:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.File;
import java.io.StringReader;
public class XmlToJavaDemo {
public static void main(String[] args) throws Exception {
// XML字符串内容
String xmlStr = "<?xml version="1.0" encoding="UTF-8" standalone="yes"?>n" +
"<user id="1">n" +
" <name>张三</name>n" +
" <age>25</age>n" +
" <hobbies>n" +
" <hobby>篮球</hobby>n" +
" <hobby>阅读</hobby>n" +
" <hobby>编程</hobby>n" +
" </hobbies>n" +
"</user>";
// 创建JAXB上下文
JAXBContext context = JAXBContext.newInstance(User.class);
// 创建反序列化器
Unmarshaller unmarshaller = context.createUnmarshaller();
// 方式1:从XML字符串转换
StringReader reader = new StringReader(xmlStr);
User userFromStr = (User) unmarshaller.unmarshal(reader);
System.out.println("从字符串转换的用户ID:" + userFromStr.getId());
System.out.println("从字符串转换的用户姓名:" + userFromStr.getName());
// 方式2:从XML文件转换
User userFromFile = (User) unmarshaller.unmarshal(new File("user.xml"));
System.out.println("从文件转换的用户年龄:" + userFromFile.getAge());
System.out.println("从文件转换的用户爱好:" + userFromFile.getHobbies());
}
}
常见问题处理
1. 类没有无参构造器
如果实体类没有无参构造器,JAXB在反序列化时会抛出实例化异常,因此必须保证映射类存在无参构造器,哪怕是private修饰的也可以。
2. 字段名和XML元素名不一致
可以在@XmlElement或@XmlAttribute注解中通过name属性指定对应的XML元素或属性名称,解决命名不一致的问题。
3. 处理命名空间
如果XML带有命名空间,可以在@XmlRootElement注解中通过namespace属性指定命名空间,保证转换时匹配正确。
JAXBXML_to_JavaJava_to_XMLJava对象转换修改时间:2026-06-18 05:21:46