From e1d85b3678d0cdfaa4d29503af6e786512d6a974 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 1 Dec 2025 10:57:11 +0000 Subject: [PATCH] Apply default property inclusion to content Previously, the setting was only applied to values. This worked for POJOs but had no effect on maps. Fixes gh-48343 --- .../jackson/autoconfigure/JacksonAutoConfiguration.java | 8 +++++--- .../autoconfigure/JacksonAutoConfigurationTests.java | 8 ++++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/module/spring-boot-jackson/src/main/java/org/springframework/boot/jackson/autoconfigure/JacksonAutoConfiguration.java b/module/spring-boot-jackson/src/main/java/org/springframework/boot/jackson/autoconfigure/JacksonAutoConfiguration.java index d0781af87c6..3969b15bd30 100644 --- a/module/spring-boot-jackson/src/main/java/org/springframework/boot/jackson/autoconfigure/JacksonAutoConfiguration.java +++ b/module/spring-boot-jackson/src/main/java/org/springframework/boot/jackson/autoconfigure/JacksonAutoConfiguration.java @@ -29,6 +29,7 @@ import java.util.function.BiConsumer; import java.util.stream.Stream; import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.annotation.PropertyAccessor; import org.jspecify.annotations.Nullable; import tools.jackson.databind.JacksonModule; @@ -371,9 +372,10 @@ public final class JacksonAutoConfiguration { if (this.jacksonProperties.isFindAndAddModules()) { builder.findAndAddModules(getClass().getClassLoader()); } - if (this.jacksonProperties.getDefaultPropertyInclusion() != null) { - builder.changeDefaultPropertyInclusion( - (handler) -> handler.withValueInclusion(this.jacksonProperties.getDefaultPropertyInclusion())); + Include propertyInclusion = this.jacksonProperties.getDefaultPropertyInclusion(); + if (propertyInclusion != null) { + builder.changeDefaultPropertyInclusion((handler) -> handler.withValueInclusion(propertyInclusion) + .withContentInclusion(propertyInclusion)); } if (this.jacksonProperties.getTimeZone() != null) { builder.defaultTimeZone(this.jacksonProperties.getTimeZone()); diff --git a/module/spring-boot-jackson/src/test/java/org/springframework/boot/jackson/autoconfigure/JacksonAutoConfigurationTests.java b/module/spring-boot-jackson/src/test/java/org/springframework/boot/jackson/autoconfigure/JacksonAutoConfigurationTests.java index 2101a96a4d0..bebaccd1122 100644 --- a/module/spring-boot-jackson/src/test/java/org/springframework/boot/jackson/autoconfigure/JacksonAutoConfigurationTests.java +++ b/module/spring-boot-jackson/src/test/java/org/springframework/boot/jackson/autoconfigure/JacksonAutoConfigurationTests.java @@ -436,9 +436,11 @@ class JacksonAutoConfigurationTests { @EnumSource @ParameterizedTest - void defaultSerializationInclusion(MapperType mapperType) { + void defaultPropertyInclusion(MapperType mapperType) { this.contextRunner.run((context) -> { ObjectMapper mapper = mapperType.getMapper(context); + assertThat(mapper.serializationConfig().getDefaultPropertyInclusion().getContentInclusion()) + .isEqualTo(JsonInclude.Include.USE_DEFAULTS); assertThat(mapper.serializationConfig().getDefaultPropertyInclusion().getValueInclusion()) .isEqualTo(JsonInclude.Include.USE_DEFAULTS); }); @@ -446,9 +448,11 @@ class JacksonAutoConfigurationTests { @EnumSource @ParameterizedTest - void customSerializationInclusion(MapperType mapperType) { + void customPropertyInclusion(MapperType mapperType) { this.contextRunner.withPropertyValues("spring.jackson.default-property-inclusion:non_null").run((context) -> { ObjectMapper mapper = mapperType.getMapper(context); + assertThat(mapper.serializationConfig().getDefaultPropertyInclusion().getContentInclusion()) + .isEqualTo(JsonInclude.Include.NON_NULL); assertThat(mapper.serializationConfig().getDefaultPropertyInclusion().getValueInclusion()) .isEqualTo(JsonInclude.Include.NON_NULL); });