
本文详解在使用 jackson-dataformat-xml 将 java 对象转为 xml 时,为何嵌套对象字段未输出、仅显示空标签,并提供正确初始化策略与完整可运行示例。
在使用 XmlMapper(来自 jackson-dataformat-xml)进行对象序列化时,Jackson 不会主动实例化 null 的嵌套对象——它只会序列化已存在的对象实例。因此,尽管 SettingsBlock 类中定义了字段默认值(如 private Boolean block1 = true;),但如果 Settings.settingsBlock 字段本身为 null,Jackson 就无法访问其内部字段,最终只生成空标签
✅ 正确做法:显式初始化嵌套对象
你需要确保嵌套对象在父类中被非 null 初始化。推荐在字段声明处直接赋值,或在构造器/@PostConstruct 中完成初始化。例如:
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
public class Settings {
private SettingsBlock settingsBlock = new SettingsBlock(); // ✅ 关键:主动实例化
private int test1 = 10;
private int test2;
}同时修正 SettingsBlock 中的语法错误(原代码 private Boolean block2=; 缺少初始值):
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
public class SettingsBlock {
private Boolean block1 = true;
private Boolean block2 = false; // ✅ 补全默认值(Boolean 默认为 null,需显式设为 false)
}? 完整可运行示例
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
public class XmlSerializationDemo {
public static void main(String[] args) throws Exception {
XmlMapper xmlMapper = new XmlMapper();
// 构造空 Settings 实例(所有字段使用默认值 + 已初始化的 SettingsBlock)
Settings settings = new Settings();
String xml = xmlMapper.writeValueAsString(settings);
System.out.println(xml);
}
}预期输出:
true false 10 0
⚠️ 注意事项:Boolean 类型字段默认值为 null(非 false),必须显式初始化(如 = false)才能在 XML 中体现;若使用 Lombok 的 @Builder,注意 @Builder.Default 可用于更灵活的默认值控制,但对嵌套对象仍需保证非 null;如需忽略 null 字段(而非输出空标签),可配置 xmlMapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_NULL),但本场景目标是保留并填充默认值,故不适用;确保 pom.xml 中 jackson-dataformat-xml 版本 ≥ 2.12(推荐最新稳定版),以获得完整注解支持和稳定性。
通过显式初始化嵌套对象,即可让 Jackson 正确遍历其字段并序列化全部默认值,完美匹配预期 XML 结构。








