使用jackson-dataformat-xml转XML时嵌套类默认值不显示问题求助
问题排查与解决方案
问题原因
- 嵌套对象未初始化:
Settings类中的settingsBlock属性没有默认初始化值,调用无参构造创建对象后该属性为null。XmlMapper默认会为null的对象类型属性生成空标签,但不会创建实际的SettingsBlock实例,因此其内部属性无法被序列化输出。 - null属性默认不序列化:
SettingsBlock的block2属性未设置默认值,默认是null,Jackson默认不会序列化null值属性,所以不会输出<block2>标签。
解决方案
方案1:初始化嵌套对象并设置属性默认值
直接修改类的字段声明,给嵌套对象和block2设置默认初始化值,是最直接的解决方式:
@Setter @Getter @NoArgsConstructor @AllArgsConstructor @Builder(toBuilder = true) public class Settings { // 初始化嵌套对象,确保无参构造时生成带默认值的SettingsBlock实例 private SettingsBlock settingsBlock = new SettingsBlock(); private int test1 = 10; private int test2; }
@Setter @Getter @NoArgsConstructor @AllArgsConstructor @Builder(toBuilder = true) public class SettingsBlock { private Boolean block1 = true; // 给block2设置默认值false,匹配期望输出 private Boolean block2 = false; }
运行原XML构建代码后,会直接输出符合期望的XML结构。
方案2:通过Jackson配置强制序列化(不修改类默认值)
如果不想修改类的初始化逻辑,可以通过XmlMapper配置和注解实现:
- 给
Settings类的settingsBlock添加@JsonProperty(required = true),确保序列化时自动实例化嵌套对象; - 给
SettingsBlock添加@JsonInclude(JsonInclude.Include.ALWAYS),强制序列化所有属性(包括null值); - 若要将
block2的null转为false,可以自定义序列化器或直接设置默认值(推荐后者)。
示例代码:
@Setter @Getter @NoArgsConstructor @AllArgsConstructor @Builder(toBuilder = true) public class Settings { @JsonProperty(required = true) private SettingsBlock settingsBlock; private int test1 = 10; private int test2; }
@Setter @Getter @NoArgsConstructor @AllArgsConstructor @Builder(toBuilder = true) @JsonInclude(JsonInclude.Include.ALWAYS) public class SettingsBlock { private Boolean block1 = true; private Boolean block2 = false; }
额外说明
- Lombok的
@NoArgsConstructor生成的构造器不会覆盖Java字段的默认初始化逻辑,字段声明时的默认值会正常生效; - 如果需要自定义XML标签名称,可以使用
@JacksonXmlProperty(localName = "自定义名称")注解,避免Jackson自动转换字段名的格式。
内容的提问来源于stack exchange,提问作者java_tech
相关产品推荐
相关产品推荐

