jaxb是jdk内置的xml绑定框架,通过注解(@xmlrootelement、@xmlelement等)实现java对象与xml互转;jdk 11+需手动引入jakarta.xml.bind依赖,且包名由javax改为jakarta。

Java JAXB(Java Architecture for XML Binding)是JDK自带的XML绑定框架,能直接将Java对象与XML相互转换,无需手动解析或拼接。核心在于用注解标记类和字段,再通过JAXBContext、Marshaller和Unmarshaller完成序列化与反序列化。JDK 11+已移除JAXB默认支持,需单独引入依赖;JDK 8–10可直接使用。
第一步:准备带注解的Java类
让Java类支持JAXB,需添加标准注解。最常用的是@XmlRootElement(标在类上,表示该类可作为XML根元素),@XmlElement(控制字段名和是否必需),@XmlAttribute(映射为属性而非子元素),@XmlAccessorType(指定访问策略,通常设为FIELD以直接操作字段)。
例如:
@XmlRootElement(name = "user")
@XmlAccessorType(XmlAccessType.FIELD)
public class User {
@XmlElement(required = true)
private String name;
@XmlElement
private int age;
@XmlAttribute
private String id;
// 必须有无参构造函数
public User() {}
// getter/setter 省略(JAXB需要,但非注解强制)
}
第二步:对象转XML(Marshalling)
用JAXBContext创建上下文,再获取Marshaller,调用marshal()方法输出XML。支持输出到File、OutputStream、Writer甚至DOMResult。
立即学习“Java免费学习笔记(深入)”;
- 确保对象字段值合法(如
required=true的字段不能为null) - 可设置格式化输出:
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true) - 中文不乱码需指定编码,如
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8")
示例代码:
User user = new User();
user.setId("u001");
user.setName("张三");
user.setAge(28);
JAXBContext context = JAXBContext.newInstance(User.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.marshal(user, new FileOutputStream("user.xml"));
第三步:XML转对象(Unmarshalling)
同样从JAXBContext出发,获取Unmarshaller,调用unmarshal()读取XML源(File、InputStream、StringReader等)。若XML结构与类不匹配(如标签名不符、缺少必需字段),会抛出JAXBException。
- 推荐先做基础校验:XML是否well-formed,根元素名是否匹配
@XmlRootElement中的name - 如需校验XSD,可传入
Schema对象:unmarshaller.setSchema(schema) - 遇到未知元素默认忽略,如需报错,设
unmarshaller.setEventHandler(...)自定义处理器
示例代码:
Unmarshaller unmarshaller = context.createUnmarshaller();
User loaded = (User) unmarshaller.unmarshal(new File("user.xml"));
System.out.println(loaded.getName()); // 输出:张三
第四步:JDK版本适配与依赖补充
JDK 11及以上不再内置JAXB,必须显式添加Maven依赖:
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>4.0.3</version>
</dependency>
注意:Jakarta EE 9+已将包名从javax.xml.bind改为jakarta.xml.bind,代码中import语句也要同步更新。
基本上就这些。JAXB上手快、写法直观,适合配置文件、简单数据交换等场景。虽然近年被Jackson XML等替代方案分流,但对标准XML结构、强类型要求明确的项目仍是稳妥选择。










