在使用Jackson进行XML格式的数据序列化时,默认生成的XML文本往往不会包含标准的XML声明头。如果对接的系统要求必须带有XML声明,就需要手动开启对应的序列化特性。下面介绍具体的实现方式。

为什么默认没有XML声明
Jackson的XmlMapper底层基于Woodstox等StAX实现,默认为了简洁输出,关闭了XML声明的写入。这在多数内部服务间通信中没有影响,但部分传统系统或严格校验的解析器会直接报错。
如何强制开启XML声明
可以通过XmlMapper的构建器来启用WRITE_XML_DECLARATION这个JsonGenerator特性,从而让序列化结果包含类似<?xml version="1.0" encoding="UTF-8"?>的声明。
示例代码
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.core.JsonGenerator;
public class XmlDeclareDemo {
public static void main(String[] args) throws Exception {
// 构建XmlMapper并强制输出XML声明
XmlMapper xmlMapper = XmlMapper.builder()
.enable(JsonGenerator.Feature.WRITE_XML_DECLARATION)
.build();
// 简单对象
User user = new User("张三", 28);
String xml = xmlMapper.writeValueAsString(user);
System.out.println(xml);
}
public static class User {
public String name;
public int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
}
上述代码运行后,控制台会输出以XML声明开头的内容:
<?xml version="1.0" encoding="UTF-8"?><User><name>张三</name><age>28</age></User>
常见注意点
- 该特性是
JsonGenerator.Feature而非SerializationFeature,不要配置错位置。 - 如果使用了
configure方式,应写为xmlMapper.configure(JsonGenerator.Feature.WRITE_XML_DECLARATION, true)。 - 编码声明取决于
XmlMapper内部的编码设置,通常默认为UTF-8。
小结
强制Jackson输出XML声明并不复杂,核心是正确启用WRITE_XML_DECLARATION。在需要与旧系统或强校验解析器对接时,这一配置可以有效避免格式不兼容问题。