JAXB是Java原生XML绑定框架,通过注解(如@XmlRootElement、@XmlElement等)标记Java类,利用JAXBContext实现对象与XML的序列化和反序列化,需无参构造器且注意JDK 11+需添加依赖。

JAXB(Java Architecture for XML Binding)是Java原生支持的XML绑定框架,能直接将Java对象与XML相互转换,无需手动解析或拼接。核心在于用注解标记类结构,再通过JAXBContext驱动序列化/反序列化。
1. 添加必要注解标记Java类
让JAXB知道如何映射字段到XML元素或属性:
- @XmlRootElement:标注在类上,指定该类为XML根元素(必需)
-
@XmlElement:控制字段/属性在XML中作为子元素出现(可设
name、required等) -
@XmlAttribute:将字段映射为XML属性(如
) - @XmlAccessorType(XmlAccessType.FIELD):告诉JAXB按字段(而非getter/setter)访问数据(推荐,避免冗余方法干扰)
- @XmlTransient:忽略某个字段,不参与XML转换
示例:
public class User {@XmlAttribute
private Long id;
@XmlElement
private String name;
@XmlElement(name = "email_addr")
private String email;
@XmlTransient
private String password;
// 必须有无参构造器
public User() {}
}
2. Java对象转XML(marshal)
使用JAXBContext创建Marshaller,调用marshal()输出XML:
立即学习“Java免费学习笔记(深入)”;
- 先用
JAXBContext.newInstance(User.class)初始化上下文 - 调用
context.createMarshaller()获取marshaller - 可设置格式化(
setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true))让XML换行缩进 - 目标可以是
File、OutputStream、Writer或DOMResult
简单示例:
JAXBContext ctx = JAXBContext.newInstance(User.class);Marshaller m = ctx.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(new User(1L, "张三", "zhang@example.com"), System.out);
3. XML转Java对象(unmarshal)
用Unmarshaller将XML源(字符串、文件、InputStream等)还原为对象:
- 同样从
JAXBContext获取Unmarshaller - 支持
StringReader(处理XML字符串)、File、InputStream等输入源 - 注意:XML根元素名必须与
@XmlRootElement声明的类匹配,否则抛异常
例如从字符串解析:
String xml = "Unmarshaller u = ctx.createUnmarshaller();
User user = (User) u.unmarshal(new StringReader(xml));
4. 注意事项和常见问题
实际使用中容易踩坑的地方:
- Java类必须有**无参构造器**(JAXB实例化时调用)
- 字段不能是
final或static(除非加@XmlTransient) - 集合类型需用
@XmlElement包裹,并确保泛型信息可用(建议用List而非ArrayList) -
中文乱码?设置marshaller的
setProperty(Marshaller.JAXB_ENCODING, "UTF-8") - JDK 11+默认移除了JAXB模块,需显式添加Maven依赖:
jakarta.xml.bind:jakarta.xml.bind-api+org.glassfish.jaxb:jaxb-runtime
基本上就这些。用对注解、配好上下文、注意JDK版本兼容性,JAXB的XML互转就很稳。










