From e9d93801a7d407139b244635d74f90fb6f5154e1 Mon Sep 17 00:00:00 2001 From: Ivan Petkov Date: Mon, 20 Jan 2025 13:31:05 +0200 Subject: [PATCH 1/2] Convert jackson module to use @ConfigMapping --- extensions/jackson/deployment/pom.xml | 3 -- .../jackson/deployment/JacksonProcessor.java | 4 +- ...acksonErroneousTimeZonePropertiesTest.java | 4 +- extensions/jackson/runtime/pom.xml | 3 -- .../runtime/ConfigurationCustomizer.java | 14 +++---- .../runtime/JacksonBuildTimeConfig.java | 40 +++++++++---------- 6 files changed, 30 insertions(+), 38 deletions(-) diff --git a/extensions/jackson/deployment/pom.xml b/extensions/jackson/deployment/pom.xml index a67b293e16e3a..36d5510452b79 100644 --- a/extensions/jackson/deployment/pom.xml +++ b/extensions/jackson/deployment/pom.xml @@ -56,9 +56,6 @@ ${project.version} - - -AlegacyConfigRoot=true - diff --git a/extensions/jackson/deployment/src/main/java/io/quarkus/jackson/deployment/JacksonProcessor.java b/extensions/jackson/deployment/src/main/java/io/quarkus/jackson/deployment/JacksonProcessor.java index bbb443b535381..0406ab7204afb 100644 --- a/extensions/jackson/deployment/src/main/java/io/quarkus/jackson/deployment/JacksonProcessor.java +++ b/extensions/jackson/deployment/src/main/java/io/quarkus/jackson/deployment/JacksonProcessor.java @@ -513,10 +513,10 @@ public SyntheticBeanBuildItem jacksonSupport(JacksonSupportRecorder recorder, } private Optional determinePropertyNamingStrategyClassName(JacksonBuildTimeConfig jacksonBuildTimeConfig) { - if (jacksonBuildTimeConfig.propertyNamingStrategy.isEmpty()) { + if (jacksonBuildTimeConfig.propertyNamingStrategy().isEmpty()) { return Optional.empty(); } - var propertyNamingStrategy = jacksonBuildTimeConfig.propertyNamingStrategy.get(); + var propertyNamingStrategy = jacksonBuildTimeConfig.propertyNamingStrategy().get(); Field field; try { diff --git a/extensions/jackson/deployment/src/test/java/io/quarkus/jackson/deployment/JacksonErroneousTimeZonePropertiesTest.java b/extensions/jackson/deployment/src/test/java/io/quarkus/jackson/deployment/JacksonErroneousTimeZonePropertiesTest.java index db53d96ddedd8..f874a5e84edd0 100644 --- a/extensions/jackson/deployment/src/test/java/io/quarkus/jackson/deployment/JacksonErroneousTimeZonePropertiesTest.java +++ b/extensions/jackson/deployment/src/test/java/io/quarkus/jackson/deployment/JacksonErroneousTimeZonePropertiesTest.java @@ -2,7 +2,6 @@ import static org.junit.jupiter.api.Assertions.fail; -import java.time.zone.ZoneRulesException; import java.util.Date; import jakarta.inject.Inject; @@ -15,6 +14,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.quarkus.test.QuarkusUnitTest; +import io.smallrye.config.ConfigValidationException; public class JacksonErroneousTimeZonePropertiesTest { @@ -22,7 +22,7 @@ public class JacksonErroneousTimeZonePropertiesTest { static final QuarkusUnitTest config = new QuarkusUnitTest() .withApplicationRoot((jar) -> jar.addClasses(Pojo.class, SomeBean.class)) .withConfigurationResource("application-erroneous-timezone-properties.properties") - .setExpectedException(ZoneRulesException.class); + .setExpectedException(ConfigValidationException.class); @Test public void test() { diff --git a/extensions/jackson/runtime/pom.xml b/extensions/jackson/runtime/pom.xml index fafc5dde6bc8e..3316ce40d38ff 100644 --- a/extensions/jackson/runtime/pom.xml +++ b/extensions/jackson/runtime/pom.xml @@ -64,9 +64,6 @@ ${project.version} - - -AlegacyConfigRoot=true - diff --git a/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/ConfigurationCustomizer.java b/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/ConfigurationCustomizer.java index 3aa6ef532010b..f803fa1662a0c 100644 --- a/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/ConfigurationCustomizer.java +++ b/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/ConfigurationCustomizer.java @@ -24,30 +24,30 @@ public class ConfigurationCustomizer implements ObjectMapperCustomizer { @Override public void customize(ObjectMapper objectMapper) { - if (!jacksonBuildTimeConfig.failOnUnknownProperties) { + if (!jacksonBuildTimeConfig.failOnUnknownProperties()) { // this feature is enabled by default, so we disable it objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); } - if (!jacksonBuildTimeConfig.failOnEmptyBeans) { + if (!jacksonBuildTimeConfig.failOnEmptyBeans()) { // this feature is enabled by default, so we disable it objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); } - if (!jacksonBuildTimeConfig.writeDatesAsTimestamps) { + if (!jacksonBuildTimeConfig.writeDatesAsTimestamps()) { // this feature is enabled by default, so we disable it objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); } - if (!jacksonBuildTimeConfig.writeDurationsAsTimestamps) { + if (!jacksonBuildTimeConfig.writeDurationsAsTimestamps()) { // this feature is enabled by default, so we disable it objectMapper.disable(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS); } - if (jacksonBuildTimeConfig.acceptCaseInsensitiveEnums) { + if (jacksonBuildTimeConfig.acceptCaseInsensitiveEnums()) { objectMapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS); } - JsonInclude.Include serializationInclusion = jacksonBuildTimeConfig.serializationInclusion.orElse(null); + JsonInclude.Include serializationInclusion = jacksonBuildTimeConfig.serializationInclusion().orElse(null); if (serializationInclusion != null) { objectMapper.setSerializationInclusion(serializationInclusion); } - ZoneId zoneId = jacksonBuildTimeConfig.timezone.orElse(null); + ZoneId zoneId = jacksonBuildTimeConfig.timezone().orElse(null); if ((zoneId != null) && !zoneId.getId().equals("UTC")) { // Jackson uses UTC as the default, so let's not reset it objectMapper.setTimeZone(TimeZone.getTimeZone(zoneId)); } diff --git a/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/JacksonBuildTimeConfig.java b/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/JacksonBuildTimeConfig.java index 4dc633c8ac07f..e66c7a735092a 100644 --- a/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/JacksonBuildTimeConfig.java +++ b/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/JacksonBuildTimeConfig.java @@ -4,74 +4,72 @@ import java.util.Optional; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; - -import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithDefault; @ConfigRoot(phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED) -public class JacksonBuildTimeConfig { +@ConfigMapping(prefix = "quarkus.jackson") +public interface JacksonBuildTimeConfig { /** * If enabled, Jackson will fail when encountering unknown properties. *

* You can still override it locally with {@code @JsonIgnoreProperties(ignoreUnknown = false)}. */ - @ConfigItem(defaultValue = "false") - public boolean failOnUnknownProperties; + @WithDefault("false") + boolean failOnUnknownProperties(); /** * If enabled, Jackson will fail when no accessors are found for a type. * This is enabled by default to match the default Jackson behavior. */ - @ConfigItem(defaultValue = "true") - public boolean failOnEmptyBeans; + @WithDefault("true") + boolean failOnEmptyBeans(); /** * If enabled, Jackson will serialize dates as numeric value(s). * When disabled, they are serialized in ISO 8601 format. */ - @ConfigItem(defaultValue = "false") - public boolean writeDatesAsTimestamps; + @WithDefault("false") + boolean writeDatesAsTimestamps(); /** * If enabled, Jackson will serialize durations as numeric value(s). * When disabled, they are serialized in ISO 8601 format. * This is enabled by default to match the default Jackson behavior. */ - @ConfigItem(defaultValue = "true") - public boolean writeDurationsAsTimestamps; + @WithDefault("true") + boolean writeDurationsAsTimestamps(); /** * If enabled, Jackson will ignore case during Enum deserialization. */ - @ConfigItem(defaultValue = "false") - public boolean acceptCaseInsensitiveEnums; + @WithDefault("false") + boolean acceptCaseInsensitiveEnums(); /** * If set, Jackson will default to using the specified timezone when formatting dates. * Some examples values are "Asia/Jakarta" and "GMT+3". * If not set, Jackson will use its own default. */ - @ConfigItem(defaultValue = "UTC") - public Optional timezone; + @WithDefault("UTC") + Optional timezone(); /** * Define which properties of Java Beans are to be included in serialization. */ - @ConfigItem - public Optional serializationInclusion; + Optional serializationInclusion(); /** * Defines how names of JSON properties ("external names") are derived * from names of POJO methods and fields ("internal names"). * The value can be one of the one of the constants in {@link com.fasterxml.jackson.databind.PropertyNamingStrategies}, * so for example, {@code LOWER_CAMEL_CASE} or {@code UPPER_CAMEL_CASE}. - * + *

* The value can also be a fully qualified class name of a {@link com.fasterxml.jackson.databind.PropertyNamingStrategy} * subclass. */ - @ConfigItem - public Optional propertyNamingStrategy; + Optional propertyNamingStrategy(); } From b7b742e637635fb24d642221f532343f4954d65a Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Tue, 21 Jan 2025 10:56:48 +0100 Subject: [PATCH 2/2] Drop the Optional from timezone setting in Jackson It has a default value so no need for an Optional wrapper. --- .../io/quarkus/jackson/runtime/ConfigurationCustomizer.java | 4 ++-- .../io/quarkus/jackson/runtime/JacksonBuildTimeConfig.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/ConfigurationCustomizer.java b/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/ConfigurationCustomizer.java index f803fa1662a0c..3f63a61bf821f 100644 --- a/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/ConfigurationCustomizer.java +++ b/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/ConfigurationCustomizer.java @@ -47,8 +47,8 @@ public void customize(ObjectMapper objectMapper) { if (serializationInclusion != null) { objectMapper.setSerializationInclusion(serializationInclusion); } - ZoneId zoneId = jacksonBuildTimeConfig.timezone().orElse(null); - if ((zoneId != null) && !zoneId.getId().equals("UTC")) { // Jackson uses UTC as the default, so let's not reset it + ZoneId zoneId = jacksonBuildTimeConfig.timezone(); + if (!zoneId.getId().equals("UTC")) { // Jackson uses UTC as the default, so let's not reset it objectMapper.setTimeZone(TimeZone.getTimeZone(zoneId)); } if (jacksonSupport.configuredNamingStrategy().isPresent()) { diff --git a/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/JacksonBuildTimeConfig.java b/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/JacksonBuildTimeConfig.java index e66c7a735092a..47931ebaba869 100644 --- a/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/JacksonBuildTimeConfig.java +++ b/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/JacksonBuildTimeConfig.java @@ -4,6 +4,7 @@ import java.util.Optional; import com.fasterxml.jackson.annotation.JsonInclude; + import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; import io.smallrye.config.ConfigMapping; @@ -52,10 +53,9 @@ public interface JacksonBuildTimeConfig { /** * If set, Jackson will default to using the specified timezone when formatting dates. * Some examples values are "Asia/Jakarta" and "GMT+3". - * If not set, Jackson will use its own default. */ @WithDefault("UTC") - Optional timezone(); + ZoneId timezone(); /** * Define which properties of Java Beans are to be included in serialization.