From 889dee7ab1dc0418a911ec0d2697ce9a9bc26f87 Mon Sep 17 00:00:00 2001 From: ChangYong Date: Tue, 29 Jun 2021 16:16:18 +0900 Subject: [PATCH] Add JavaTimeModule to Jackson2ExecutionContextSerializer Resolves #3952 --- spring-batch-core/pom.xml | 6 +++++ ...kson2ExecutionContextStringSerializer.java | 2 ++ ...ExecutionContextStringSerializerTests.java | 22 ++++++++++++++++++- 3 files changed, 29 insertions(+), 1 deletion(-) 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); + } + }