From e6c37a60956368775b5b6246558081e3d9efc423 Mon Sep 17 00:00:00 2001 From: Filip Hrisafov Date: Wed, 11 Dec 2019 23:42:59 +0100 Subject: [PATCH] Disable Jackson SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS by default Jackson added a breaking change in 2.10 for the way Duration is serialized. Before that the DurationSerializer was using SerializationFeature.WRITE_DATES_AS_TIMESTAMPS to check whether Duration should be serialized as a timestamp or not. Since 2.10 Jackson uses SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS to check whether Duration should be serialized as a timestamp or not. This commit aligns the default for SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS with the default for SerializationFeature.WRITE_DATES_AS_TIMESTAMPS The change in Jackson was done in https://github.com/FasterXML/jackson-modules-java8/pull/75 fixes gh-19345 --- .../jackson/JacksonAutoConfiguration.java | 1 + .../jackson/JacksonAutoConfigurationTests.java | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration.java index 79caab4a3eb7..ed6518cfb8d9 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration.java @@ -88,6 +88,7 @@ public class JacksonAutoConfiguration { static { Map featureDefaults = new HashMap<>(); featureDefaults.put(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + featureDefaults.put(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS, false); FEATURE_DEFAULTS = Collections.unmodifiableMap(featureDefaults); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfigurationTests.java index 85f751f43518..cbdaae8b0ed3 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfigurationTests.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.time.Duration; import java.util.Date; import java.util.HashSet; import java.util.Set; @@ -378,6 +379,15 @@ void writeDatesAsTimestampsDefault() { }); } + @Test + void writeDurationAsTimestampsDefault() { + this.contextRunner.run((context) -> { + ObjectMapper mapper = context.getBean(ObjectMapper.class); + Duration duration = Duration.ofHours(2); + assertThat(mapper.writeValueAsString(duration)).isEqualTo("\"PT2H\""); + }); + } + @Test void writeWithVisibility() { this.contextRunner