From 2c8cfff58e37c2c7f676a186ef104313ffc63011 Mon Sep 17 00:00:00 2001 From: Jooyoung Pyoung Date: Mon, 21 Jul 2025 01:09:47 +0900 Subject: [PATCH] GH-10235: Remove Joda Time support from Jackson 3 ObjectMapper Fixes: #10235 * Remove `JodaModule` dependency and related code Signed-off-by: Jooyoung Pyoung --- build.gradle | 1 - .../json/JacksonJsonObjectMapperTests.java | 66 ++----------------- .../json/JacksonMessagingUtilsTests.java | 15 +---- 3 files changed, 10 insertions(+), 72 deletions(-) diff --git a/build.gradle b/build.gradle index fad1fa67f41..6e9928f0398 100644 --- a/build.gradle +++ b/build.gradle @@ -495,7 +495,6 @@ project('spring-integration-core') { api 'io.micrometer:micrometer-observation' optionalApi 'tools.jackson.core:jackson-databind' - optionalApi 'tools.jackson.datatype:jackson-datatype-joda' optionalApi('tools.jackson.module:jackson-module-kotlin') { exclude group: 'org.jetbrains.kotlin' } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/support/json/JacksonJsonObjectMapperTests.java b/spring-integration-core/src/test/java/org/springframework/integration/support/json/JacksonJsonObjectMapperTests.java index b453add34fc..dc9724e65bb 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/support/json/JacksonJsonObjectMapperTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/support/json/JacksonJsonObjectMapperTests.java @@ -39,8 +39,6 @@ import java.util.Set; import java.util.stream.Collectors; -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -49,7 +47,6 @@ import tools.jackson.databind.JsonNode; import tools.jackson.databind.ObjectMapper; import tools.jackson.databind.json.JsonMapper; -import tools.jackson.datatype.joda.JodaModule; import tools.jackson.module.kotlin.KotlinModule; import static org.assertj.core.api.Assertions.assertThat; @@ -62,10 +59,6 @@ */ class JacksonJsonObjectMapperTests { - private static final JacksonModule JODA_MODULE = new JodaModule(); - - private static final JacksonModule KOTLIN_MODULE = new KotlinModule.Builder().build(); - private JacksonJsonObjectMapper mapper; @BeforeEach @@ -75,17 +68,15 @@ void setUp() { @Test void compareAutoDiscoveryVsManualModules() { + KotlinModule kotlinModule = new KotlinModule.Builder().build(); ObjectMapper manualMapper = JsonMapper.builder() - .addModules(collectWellKnownModulesIfAvailable()) + .addModules(kotlinModule) .build(); - Set collectedModuleNames = getModuleNames(collectWellKnownModulesIfAvailable()); - Set autoModuleNames = getModuleNames(mapper.getObjectMapper().getRegisteredModules()); - assertThat(autoModuleNames).isEqualTo(collectedModuleNames); - Set manualModuleNames = getModuleNames(manualMapper.getRegisteredModules()); - assertThat(manualModuleNames).isEqualTo(collectedModuleNames); + + assertThat(autoModuleNames).isEqualTo(manualModuleNames); } @Test @@ -196,7 +187,7 @@ void testMapTypes() throws IOException { } @Test - public void testOptional() throws IOException { + void testOptional() throws IOException { TestData data = new TestData("John", Optional.of("john@test.com"), Optional.empty()); String json = mapper.toJson(data); @@ -207,72 +198,29 @@ public void testOptional() throws IOException { } @Test - public void testJavaTime() throws Exception { + void testJavaTime() throws IOException { LocalDateTime localDateTime = LocalDateTime.of(2000, 1, 1, 0, 0); ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.of("UTC")); TimeData data = new TimeData(localDateTime, zonedDateTime); String json = mapper.toJson(data); - assertThat("{\"localDate\":\"2000-01-01T00:00:00\",\"zoneDate\":\"2000-01-01T00:00:00Z\"}").isEqualTo(json); + assertThat(json).isEqualTo("{\"localDate\":\"2000-01-01T00:00:00\",\"zoneDate\":\"2000-01-01T00:00:00Z\"}"); TimeData deserialized = mapper.fromJson(json, TimeData.class); assertThat(deserialized.localDate()).isEqualTo(data.localDate()); assertThat(deserialized.zoneDate().toInstant()).isEqualTo(data.zoneDate().toInstant()); } - @Test - public void testJodaWithJodaModule() throws Exception { - ObjectMapper objectMapper = mapper.getObjectMapper(); - Set registeredModules = getModuleNames(objectMapper.getRegisteredModules()); - assertThat(registeredModules.contains(JODA_MODULE.getModuleName())).isTrue(); - - org.joda.time.DateTime jodaDateTime = new DateTime(2000, 1, 1, 0, 0, DateTimeZone.UTC); - JodaData data = new JodaData("John", jodaDateTime); - - String json = mapper.toJson(data); - assertThat("{\"name\":\"John\",\"jodaDate\":\"2000-01-01T00:00:00.000Z\"}").isEqualTo(json); - - JodaData deserialized = mapper.fromJson(json, JodaData.class); - assertThat(deserialized.name()).isEqualTo(data.name()); - assertThat(deserialized.jodaDate()).isEqualTo(data.jodaDate()); - } - - @Test - public void testJodaWithoutJodaModule() { - ObjectMapper customMapper = JsonMapper.builder().build(); - JacksonJsonObjectMapper mapper = new JacksonJsonObjectMapper(customMapper); - - Set registeredModules = getModuleNames(mapper.getObjectMapper().getRegisteredModules()); - assertThat(registeredModules.contains(JODA_MODULE.getModuleName())).isFalse(); - - org.joda.time.DateTime jodaDateTime = new DateTime(2000, 1, 1, 0, 0, DateTimeZone.UTC); - JodaData data = new JodaData("John", jodaDateTime); - - assertThatThrownBy(() -> mapper.toJson(data)) - .isInstanceOf(IOException.class); - - String json = "{\"name\":\"John\",\"jodaDate\":\"2000-01-01T00:00:00.000Z\"}"; - assertThatThrownBy(() -> mapper.fromJson(json, JodaData.class)) - .isInstanceOf(IOException.class); - } - private Set getModuleNames(Collection modules) { return modules.stream() .map(JacksonModule::getModuleName) .collect(Collectors.toUnmodifiableSet()); } - private List collectWellKnownModulesIfAvailable() { - return List.of(JODA_MODULE, KOTLIN_MODULE); - } - private record TestData(String name, Optional email, Optional age) { } private record TimeData(LocalDateTime localDate, ZonedDateTime zoneDate) { } - private record JodaData(String name, org.joda.time.DateTime jodaDate) { - } - } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/support/json/JacksonMessagingUtilsTests.java b/spring-integration-core/src/test/java/org/springframework/integration/support/json/JacksonMessagingUtilsTests.java index 22806277e1b..505eacb751f 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/support/json/JacksonMessagingUtilsTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/support/json/JacksonMessagingUtilsTests.java @@ -16,9 +16,7 @@ package org.springframework.integration.support.json; -import java.util.Arrays; import java.util.Collection; -import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -26,7 +24,6 @@ import org.junit.jupiter.api.Test; import tools.jackson.databind.JacksonModule; import tools.jackson.databind.ObjectMapper; -import tools.jackson.datatype.joda.JodaModule; import tools.jackson.module.kotlin.KotlinModule; import org.springframework.integration.message.AdviceMessage; @@ -53,16 +50,10 @@ void setUp() { } @Test - void shouldIncludeWellKnownModules() { - List wellKnownModules = Arrays.asList( - new JodaModule(), - new KotlinModule.Builder().build() - ); - - Set wellKnownModuleNames = getModuleNames(wellKnownModules); + void shouldIncludeKotlinModule() { + KotlinModule kotlinModule = new KotlinModule.Builder().build(); Set registeredModuleNames = getModuleNames(mapper.getRegisteredModules()); - - assertThat(registeredModuleNames).containsAll(wellKnownModuleNames); + assertThat(registeredModuleNames).contains(kotlinModule.getModuleName()); } @Test