jackson xml绑定必须引入jackson-dataformat-xml依赖,使用xmlmapper而非objectmapper,根类需@jacksonxmlrootelement,字段用@jacksonxmlproperty控制元素/属性,空值需@jsoninclude(jsoninclude.include.always)显式处理,xmlmapper需配置缩进、utf-8编码及xmlfactory以避免乱码和流未关闭问题。

Jackson XML绑定需要额外引入jackson-dataformat-xml
不加这个依赖,XmlMapper类根本找不到,编译直接报错ClassNotFoundException。Maven里只引了jackson-databind是不够的,XML支持是独立模块。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 必须在
pom.xml中显式添加jackson-dataformat-xml依赖,版本要和jackson-core、jackson-databind对齐(比如都是2.15.x) - 别用
ObjectMapper去处理XML——它默认不支持XML,得用子类XmlMapper - 如果项目里同时用JSON和XML,别共用一个
ObjectMapper实例;XmlMapper继承自ObjectMapper,但配置项不完全兼容
@JacksonXmlRootElement和@JacksonXmlProperty不是可选的
Java类转XML时,没有@JacksonXmlRootElement,XmlMapper会抛JsonMappingException,提示“Root name required for XML”;字段没加@JacksonXmlProperty或类似注解,可能被忽略、变成属性(attribute)而非元素(element),或者顺序错乱。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 根类必须标
@JacksonXmlRootElement(localName = "xxx"),否则序列化失败 - 字段想作为XML子元素,优先用
@JacksonXmlProperty(localName = "xxx");想当属性就加isAttribute = true - 集合字段默认会被包一层父标签(如
<items><item>...</item></items>),不想包就加@JacksonXmlElementWrapper(useWrapping = false)
XML默认不支持String空值和null字段输出
比如字段值为null或空字符串"",默认序列化后直接消失,前端收不到对应节点,容易引发NPE或逻辑误判。这不是bug,是Jackson XML的默认行为。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 让空值也输出,需配置
XmlMapper.setDefaultUseWrapper(false)并启用SerializationFeature.WRITE_NULL_MAP_VALUES(注意:该选项对XML字段效果有限,更可靠的是用@JsonInclude(JsonInclude.Include.ALWAYS)) - 对单个字段强制输出空值,加
@JsonInclude(JsonInclude.Include.ALWAYS)注解(它对XML也生效) - 避免依赖
WRITE_EMPTY_JSON_ARRAYS这类JSON专用配置,XML场景下无效
中文字符乱码、缩进失效、命名空间问题集中出现在XmlMapper构造阶段
不手动配置XmlFactory,默认输出是无缩进、UTF-8但BOM缺失、无命名空间声明的紧凑XML,HTTP响应头若没设Content-Type: application/xml;charset=UTF-8,浏览器或老系统就显示乱码。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 创建
XmlMapper时用new XmlMapper(new XmlFactory().enable(JsonGenerator.Feature.AUTO_CLOSE_TARGET)),防止流未关闭 - 开启缩进:
xmlMapper.enable(SerializationFeature.INDENT_OUTPUT) - 确保写入
OutputStream前已指定UTF-8编码(如new OutputStreamWriter(out, StandardCharsets.UTF_8)),别依赖平台默认编码 - 有命名空间需求?必须手动设置
XmlSerializerProvider并配合@JacksonXmlRootElement(namespace = "..."),默认不生成xmlns
最常被跳过的其实是XmlFactory的编码配置和OutputStream的charset绑定——这两处一漏,本地测试正常,上线就乱码。










