diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java index e74e377465b8..b438d8a36941 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java @@ -24,6 +24,7 @@ import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration; import org.springframework.batch.core.explore.JobExplorer; import org.springframework.batch.core.launch.JobLauncher; +import org.springframework.batch.core.repository.ExecutionContextSerializer; import org.springframework.batch.core.repository.JobRepository; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.ExitCodeGenerator; @@ -62,6 +63,7 @@ * @author EddĂș MelĂ©ndez * @author Kazuki Shimizu * @author Mahmoud Ben Hassine + * @author Sanghyuk Jung * @since 1.0.0 */ @AutoConfiguration(after = { HibernateJpaAutoConfiguration.class, TransactionAutoConfiguration.class }) @@ -102,13 +104,17 @@ static class SpringBootBatchConfiguration extends DefaultBatchConfiguration { private final List batchConversionServiceCustomizers; + private final ExecutionContextSerializer serializer; + SpringBootBatchConfiguration(DataSource dataSource, @BatchDataSource ObjectProvider batchDataSource, PlatformTransactionManager transactionManager, BatchProperties properties, - ObjectProvider batchConversionServiceCustomizers) { + ObjectProvider batchConversionServiceCustomizers, + ObjectProvider executionContextSerializer) { this.dataSource = batchDataSource.getIfAvailable(() -> dataSource); this.transactionManager = transactionManager; this.properties = properties; this.batchConversionServiceCustomizers = batchConversionServiceCustomizers.orderedStream().toList(); + this.serializer = executionContextSerializer.getIfAvailable(super::getExecutionContextSerializer); } @Override @@ -133,6 +139,11 @@ protected Isolation getIsolationLevelForCreate() { return (isolation != null) ? isolation : super.getIsolationLevelForCreate(); } + @Override + protected ExecutionContextSerializer getExecutionContextSerializer() { + return this.serializer; + } + @Override protected ConfigurableConversionService getConversionService() { ConfigurableConversionService conversionService = super.getConversionService(); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java index 3c2c63d781a0..d493c07fd3bf 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java @@ -43,6 +43,7 @@ import org.springframework.batch.core.job.AbstractJob; import org.springframework.batch.core.launch.JobLauncher; import org.springframework.batch.core.launch.JobOperator; +import org.springframework.batch.core.repository.ExecutionContextSerializer; import org.springframework.batch.core.repository.JobRepository; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; @@ -430,6 +431,17 @@ void conversionServiceCustomizersAreCalled() { }); } + @Test + void whenTheUserDefinesCustomExecutionContextSerializer() { + this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) + .withUserConfiguration(ExecutionContextSerializerConfiguration.class) + .run((context) -> { + SpringBootBatchConfiguration batchConfiguration = context.getBean(SpringBootBatchConfiguration.class); + ExecutionContextSerializer serializer = context.getBean(ExecutionContextSerializer.class); + assertThat(batchConfiguration.getExecutionContextSerializer()).isSameAs(serializer); + }); + } + @Test void whenTheUserDefinesAJobNameAsJobInstanceValidates() { JobLauncherApplicationRunner runner = createInstance("another"); @@ -777,4 +789,14 @@ BatchConversionServiceCustomizer anotherBatchConversionServiceCustomizer() { } + @Configuration(proxyBeanMethods = false) + static class ExecutionContextSerializerConfiguration { + + @Bean + ExecutionContextSerializer executionContextSerializer() { + return mock(ExecutionContextSerializer.class); + } + + } + }