diff --git a/spring-batch-core/pom.xml b/spring-batch-core/pom.xml
index 0880ddb25..1b00611c5 100644
--- a/spring-batch-core/pom.xml
+++ b/spring-batch-core/pom.xml
@@ -72,6 +72,12 @@
${jackson.version}
true
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
+ ${jackson.version}
+ true
+
jakarta.annotation
jakarta.annotation-api
diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/Jackson2ExecutionContextStringSerializer.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/Jackson2ExecutionContextStringSerializer.java
index 61dba8bc6..4c6bad109 100644
--- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/Jackson2ExecutionContextStringSerializer.java
+++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/Jackson2ExecutionContextStringSerializer.java
@@ -54,6 +54,7 @@ import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.batch.core.JobParameter;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.repository.ExecutionContextSerializer;
@@ -129,6 +130,7 @@ public class Jackson2ExecutionContextStringSerializer implements ExecutionContex
.configure(MapperFeature.BLOCK_UNSAFE_POLYMORPHIC_BASE_TYPES, true)
.setDefaultTyping(createTrustedDefaultTyping(trustedClassNames))
.addModule(new JobParametersModule())
+ .addModule(new JavaTimeModule())
.build();
}
diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/Jackson2ExecutionContextStringSerializerTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/Jackson2ExecutionContextStringSerializerTests.java
index ae3e7b74b..548359a33 100644
--- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/Jackson2ExecutionContextStringSerializerTests.java
+++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/Jackson2ExecutionContextStringSerializerTests.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2008-2022 the original author or authors.
+ * Copyright 2008-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.sql.Timestamp;
import java.time.Instant;
+import java.time.LocalDate;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@@ -212,4 +213,23 @@ class Jackson2ExecutionContextStringSerializerTests extends AbstractExecutionCon
assertEquals(timestamp, deserializedTimestamp);
}
+ @Test
+ void testJavaTimeLocalDateSerialization() throws IOException {
+ // given
+ Jackson2ExecutionContextStringSerializer serializer = new Jackson2ExecutionContextStringSerializer();
+ Map map = new HashMap<>();
+ LocalDate now = LocalDate.now();
+ map.put("now", now);
+
+ // when
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ serializer.serialize(map, outputStream);
+ InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
+ Map deserializedContext = serializer.deserialize(inputStream);
+
+ // then
+ LocalDate deserializedNow = (LocalDate) deserializedContext.get("now");
+ assertEquals(now, deserializedNow);
+ }
+
}