Skip to content

Commit e5b2ad9

Browse files
committed
Add possibility to configure a custom ExecutionContextSerializer in BatchAutoConfiguration
See gh-38328
1 parent f3ec5da commit e5b2ad9

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java

+14-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration;
2525
import org.springframework.batch.core.explore.JobExplorer;
2626
import org.springframework.batch.core.launch.JobLauncher;
27+
import org.springframework.batch.core.repository.ExecutionContextSerializer;
2728
import org.springframework.batch.core.repository.JobRepository;
29+
import org.springframework.batch.core.repository.dao.DefaultExecutionContextSerializer;
2830
import org.springframework.beans.factory.ObjectProvider;
2931
import org.springframework.boot.ExitCodeGenerator;
3032
import org.springframework.boot.autoconfigure.AutoConfiguration;
@@ -62,6 +64,7 @@
6264
* @author Eddú Meléndez
6365
* @author Kazuki Shimizu
6466
* @author Mahmoud Ben Hassine
67+
* @author Lars Uffmann
6568
* @since 1.0.0
6669
*/
6770
@AutoConfiguration(after = { HibernateJpaAutoConfiguration.class, TransactionAutoConfiguration.class })
@@ -102,13 +105,18 @@ static class SpringBootBatchConfiguration extends DefaultBatchConfiguration {
102105

103106
private final List<BatchConversionServiceCustomizer> batchConversionServiceCustomizers;
104107

108+
private final ExecutionContextSerializer executionContextSerializer;
109+
105110
SpringBootBatchConfiguration(DataSource dataSource, @BatchDataSource ObjectProvider<DataSource> batchDataSource,
106111
PlatformTransactionManager transactionManager, BatchProperties properties,
107-
ObjectProvider<BatchConversionServiceCustomizer> batchConversionServiceCustomizers) {
112+
ObjectProvider<BatchConversionServiceCustomizer> batchConversionServiceCustomizers,
113+
ObjectProvider<ExecutionContextSerializer> executionContextSerializer) {
108114
this.dataSource = batchDataSource.getIfAvailable(() -> dataSource);
109115
this.transactionManager = transactionManager;
110116
this.properties = properties;
111117
this.batchConversionServiceCustomizers = batchConversionServiceCustomizers.orderedStream().toList();
118+
this.executionContextSerializer = executionContextSerializer
119+
.getIfAvailable(DefaultExecutionContextSerializer::new);
112120
}
113121

114122
@Override
@@ -142,6 +150,11 @@ protected ConfigurableConversionService getConversionService() {
142150
return conversionService;
143151
}
144152

153+
@Override
154+
protected ExecutionContextSerializer getExecutionContextSerializer() {
155+
return this.executionContextSerializer;
156+
}
157+
145158
}
146159

147160
@Configuration(proxyBeanMethods = false)

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java

+35
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@
4343
import org.springframework.batch.core.job.AbstractJob;
4444
import org.springframework.batch.core.launch.JobLauncher;
4545
import org.springframework.batch.core.launch.JobOperator;
46+
import org.springframework.batch.core.repository.ExecutionContextSerializer;
4647
import org.springframework.batch.core.repository.JobRepository;
48+
import org.springframework.batch.core.repository.dao.DefaultExecutionContextSerializer;
49+
import org.springframework.batch.core.repository.dao.Jackson2ExecutionContextStringSerializer;
4750
import org.springframework.beans.BeansException;
4851
import org.springframework.beans.factory.annotation.Autowired;
4952
import org.springframework.beans.factory.config.BeanPostProcessor;
@@ -98,6 +101,7 @@
98101
* @author Vedran Pavic
99102
* @author Kazuki Shimizu
100103
* @author Mahmoud Ben Hassine
104+
* @author Lars Uffmann
101105
*/
102106
@ExtendWith(OutputCaptureExtension.class)
103107
class BatchAutoConfigurationTests {
@@ -462,6 +466,27 @@ void whenTheUserDefinesAJobNameThatDoesNotExistWithRegisteredJobFailsFast() {
462466
.withMessage("No job found with name 'three'");
463467
}
464468

469+
@Test
470+
void customExecutionContextSerializerIsUsed() {
471+
this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class)
472+
.withUserConfiguration(CustomExecutionContextConfiguration.class)
473+
.run((context) -> {
474+
assertThat(context).hasSingleBean(Jackson2ExecutionContextStringSerializer.class);
475+
assertThat(context.getBean(SpringBootBatchConfiguration.class).getExecutionContextSerializer())
476+
.isInstanceOf(Jackson2ExecutionContextStringSerializer.class);
477+
});
478+
}
479+
480+
@Test
481+
void defaultExecutionContextSerializerIsUsed() {
482+
this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class)
483+
.run((context) -> {
484+
assertThat(context).doesNotHaveBean(ExecutionContextSerializer.class);
485+
assertThat(context.getBean(SpringBootBatchConfiguration.class).getExecutionContextSerializer())
486+
.isInstanceOf(DefaultExecutionContextSerializer.class);
487+
});
488+
}
489+
465490
private JobLauncherApplicationRunner createInstance(String... registeredJobNames) {
466491
JobLauncherApplicationRunner runner = new JobLauncherApplicationRunner(mock(JobLauncher.class),
467492
mock(JobExplorer.class), mock(JobRepository.class));
@@ -777,4 +802,14 @@ BatchConversionServiceCustomizer anotherBatchConversionServiceCustomizer() {
777802

778803
}
779804

805+
@Configuration(proxyBeanMethods = false)
806+
static class CustomExecutionContextConfiguration {
807+
808+
@Bean
809+
ExecutionContextSerializer executionContextSerializer() {
810+
return new Jackson2ExecutionContextStringSerializer();
811+
}
812+
813+
}
814+
780815
}

0 commit comments

Comments
 (0)