jaxb在jdk 9+被移除,需按版本适配:jdk 8开箱即用,jdk 9–10加--add-modules,jdk 11+引maven依赖;@xmlrootelement不可少,缺则marshal报错;中文乱码和格式靠marshaller.setproperty设置utf-8和formatted.output;字段映射需@xmlxxx注解控制,泛型集合建议转dto。

Java里用JAXB生成XML前必须确认JDK版本
JAXB在JDK 9+被移出默认类路径,直接new JAXBContext会抛ClassNotFoundException。OpenJDK 11及以后完全不带JAXB实现,不是“用不了”,而是“根本没加载”。
- JDK 8:开箱即用,
JAXBContext.newInstance()能直接跑 - JDK 9–10:需加启动参数
--add-modules java.xml.bind - JDK 11+:必须显式引入Maven依赖,例如
jakarta.xml.bind:jakarta.xml.bind-api和org.glassfish.jaxb:jaxb-runtime
@XmlRootElement缺了就无法marshal
调用marshaller.marshal()时如果对象类没加@XmlRootElement,会报IllegalArgumentException: class XXX nor any of its super class is known to this context——这不是配置错,是JAXB压根不认识这个类。
- 必须加在类上:
@XmlRootElement(name = "user"),name可选,但注解不能少 - 如果类是嵌套的(比如List里的元素),每个要序列化的实体类都得有该注解
- 接口、抽象类、无参构造器缺失也会触发同类错误,但根源不同:JAXB需要默认构造器来反序列化,而marshal阶段虽不反向,但上下文注册仍依赖它
中文乱码和格式缩进靠Marshaller属性控制
生成的XML文件打开是乱码或全挤在一行,不是编码问题没设对,就是Marshaller没开启对应开关。
本文档主要讲述的是Android数据格式解析对象JSON用法;JSON可以将Java对象转成json格式的字符串,可以将json字符串转换成Java。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
- 输出UTF-8:调用
marshaller.setProperty("jaxb.encoding", "UTF-8"),注意字符串值必须小写 - 美化输出(带换行缩进):
marshaller.setProperty("jaxb.formatted.output", true) - 指定XML声明是否写入:
marshaller.setProperty("jaxb.fragment", false)(false才写<?xml version="1.0" encoding="UTF-8"?>) - 别在
FileOutputStream里设编码,JAXB自己处理字节流,外部设编码反而可能冲突
字段不出现、顺序错、空值处理要靠@XmlXXX系列注解
生成的XML字段名不对、顺序颠倒、null字段消失或变成xsi:nil="true",都是因为没干预默认映射规则。
立即学习“Java免费学习笔记(深入)”;
- 改字段名:用
@XmlElement(name = "user_name"),别只靠setName()方法名推导 - 控顺序:加
@XmlType(propOrder = {"id", "name", "email"}),字段必须全列且与实际变量名一致 - null值处理:
@XmlElement(nillable = true)让null输出为<email xsi:nil="true"></email>;若想彻底忽略null字段,得用@XmlElement(required = false)并配合自定义Marshaller事件处理器,但更常用的是预过滤对象字段 - 别忘了
@XmlAccessorType(XmlAccessType.FIELD),否则JAXB默认按getter/setter找属性,private字段可能被跳过
JAXB对泛型集合支持弱,List









