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 4700d2008f48..88edc874690c 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 @@ -22,6 +22,7 @@ import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration; +import org.springframework.batch.core.converter.JobParametersConverter; import org.springframework.batch.core.explore.JobExplorer; import org.springframework.batch.core.launch.JobLauncher; import org.springframework.batch.core.repository.ExecutionContextSerializer; @@ -66,6 +67,7 @@ * @author Mahmoud Ben Hassine * @author Lars Uffmann * @author Lasse Wulff + * @author Yanming Zhou * @since 1.0.0 */ @AutoConfiguration(after = { HibernateJpaAutoConfiguration.class, TransactionAutoConfiguration.class }) @@ -110,18 +112,22 @@ static class SpringBootBatchConfiguration extends DefaultBatchConfiguration { private final ExecutionContextSerializer executionContextSerializer; + private final JobParametersConverter jobParametersConverter; + SpringBootBatchConfiguration(DataSource dataSource, @BatchDataSource ObjectProvider batchDataSource, PlatformTransactionManager transactionManager, @BatchTransactionManager ObjectProvider batchTransactionManager, @BatchTaskExecutor ObjectProvider batchTaskExecutor, BatchProperties properties, ObjectProvider batchConversionServiceCustomizers, - ObjectProvider executionContextSerializer) { + ObjectProvider executionContextSerializer, + ObjectProvider jobParametersConverter) { this.dataSource = batchDataSource.getIfAvailable(() -> dataSource); this.transactionManager = batchTransactionManager.getIfAvailable(() -> transactionManager); this.taskExector = batchTaskExecutor.getIfAvailable(); this.properties = properties; this.batchConversionServiceCustomizers = batchConversionServiceCustomizers.orderedStream().toList(); this.executionContextSerializer = executionContextSerializer.getIfAvailable(); + this.jobParametersConverter = jobParametersConverter.getIfAvailable(); } @Override @@ -161,6 +167,12 @@ protected ExecutionContextSerializer getExecutionContextSerializer() { : super.getExecutionContextSerializer(); } + @Override + protected JobParametersConverter getJobParametersConverter() { + return (this.jobParametersConverter != null) ? this.jobParametersConverter + : super.getJobParametersConverter(); + } + @Override protected TaskExecutor getTaskExecutor() { return (this.taskExector != null) ? this.taskExector : super.getTaskExecutor(); 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 1bf6c66d2d29..0b27d2653f96 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 @@ -39,6 +39,9 @@ import org.springframework.batch.core.configuration.JobRegistry; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration; +import org.springframework.batch.core.converter.DefaultJobParametersConverter; +import org.springframework.batch.core.converter.JobParametersConverter; +import org.springframework.batch.core.converter.JsonJobParametersConverter; import org.springframework.batch.core.explore.JobExplorer; import org.springframework.batch.core.job.AbstractJob; import org.springframework.batch.core.launch.JobLauncher; @@ -107,6 +110,7 @@ * @author Mahmoud Ben Hassine * @author Lars Uffmann * @author Lasse Wulff + * @author Yanming Zhou */ @ExtendWith(OutputCaptureExtension.class) class BatchAutoConfigurationTests { @@ -520,6 +524,27 @@ void defaultExecutionContextSerializerIsUsed() { }); } + @Test + void customJobParametersConverterIsUsed() { + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withBean(JobParametersConverter.class, JsonJobParametersConverter::new) + .withPropertyValues("spring.datasource.generate-unique-name=true") + .run((context) -> { + assertThat(context).hasSingleBean(JsonJobParametersConverter.class); + assertThat(context.getBean(SpringBootBatchConfiguration.class).getJobParametersConverter()) + .isInstanceOf(JsonJobParametersConverter.class); + }); + } + + @Test + void defaultJobParametersConverterIsUsed() { + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class).run((context) -> { + assertThat(context).doesNotHaveBean(JobParametersConverter.class); + assertThat(context.getBean(SpringBootBatchConfiguration.class).getJobParametersConverter()) + .isInstanceOf(DefaultJobParametersConverter.class); + }); + } + private JobLauncherApplicationRunner createInstance(String... registeredJobNames) { JobLauncherApplicationRunner runner = new JobLauncherApplicationRunner(mock(JobLauncher.class), mock(JobExplorer.class), mock(JobRepository.class));