JAXB反序列化需配置带注解的Java类(@XmlRootElement等)、创建JAXBContext并调用unmarshal;JDK9+需引入jakarta.xml.bind依赖并更新包名。

使用JAXB进行XML到Java对象的转换(即Unmarshalling)非常直接,关键在于正确配置实体类、确保XML结构匹配,并调用Unmarshaller解析。JDK 8及以前版本自带JAXB,JDK 9+需额外引入依赖。
准备带JAXB注解的Java类
Java类必须能被JAXB识别——通常通过@XmlRootElement标注根元素,并用@XmlElement、@XmlAttribute等声明字段与XML节点的映射关系。
- 根类必须加
@XmlRootElement(name = "person"),name值应与XML根标签一致 - 普通字段用
@XmlElement(name = "name")对应子元素名;如字段名与XML标签名相同,name属性可省略 - 需要映射属性时,用
@XmlAttribute(name = "id") - 集合类型建议用
@XmlElement(name = "item")并配合List,避免用ArrayList等具体实现类
加载XML并执行Unmarshalling
核心步骤是创建JAXBContext,获取Unmarshaller,再调用unmarshal()方法传入XML源(File、InputStream或StringReader均可)。
- 代码示例:
JAXBContext context = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Person person = (Person) unmarshaller.unmarshal(new File("person.xml")); - 若XML含命名空间,需在
@XmlRootElement中指定namespace,且unmarshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", ...)可选 - 遇到格式错误会抛
JAXBException,建议用try-catch捕获并打印e.getMessage()快速定位问题
处理常见问题
实际转换中容易卡在几个典型环节:类未识别、字段不赋值、集合为空、日期/枚举解析失败。
立即学习“Java免费学习笔记(深入)”;
- 报错“class not known to this context”:确认
JAXBContext.newInstance()参数包含所有相关类(如有嵌套对象,一并传入) - 字段为null但XML中有值:检查getter/setter是否完整、访问权限是否为public、字段是否被
@XmlAccessorType(XmlAccessType.FIELD)正确覆盖 - 集合为空:确认XML中对应子元素存在且拼写准确;若用
@XmlElementWrapper(name="items"),则XML中必须有- ...
- 日期类型转换失败:用
@XmlSchemaType(name="date")或自定义XmlAdapter处理格式(如LocalDateTime需适配器)
JDK 9+ 使用注意事项
从JDK 9开始,JAXB被移出默认模块,需手动添加Maven依赖:
- Maven坐标(推荐Jakarta EE版本):
jakarta.xml.bind
jakarta.xml.bind-api
4.0.0
org.glassfish.jaxb
jaxb-runtime
4.0.3 - 包名已从
javax.xml.bind升级为jakarta.xml.bind,导入语句和注解类名需同步更新










