Skip to content

Commit 461ae65

Browse files
committed
Add ability to customize the job parameters converter in the default batch configuration
Before this commit, it was impossible to customize the job parameters converter without overriding the entire`jobOperator()` method. This commit makes it possible to override `getJobParametersConverter()` or define a bean of type `JobParametersConverter` to customize the job parameters converter used by the job operator. Resolves #4650
1 parent 846648b commit 461ae65

File tree

4 files changed

+78
-0
lines changed

4 files changed

+78
-0
lines changed

Diff for: spring-batch-core/src/main/java/org/springframework/batch/core/configuration/annotation/BatchRegistrar.java

+6
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,12 @@ private void registerJobOperator(BeanDefinitionRegistry registry, EnableBatchPro
257257
beanDefinitionBuilder.addPropertyReference("jobExplorer", "jobExplorer");
258258
beanDefinitionBuilder.addPropertyReference("jobRegistry", "jobRegistry");
259259

260+
// set optional properties
261+
String jobParametersConverterRef = batchAnnotation.jobParametersConverterRef();
262+
if (registry.containsBeanDefinition(jobParametersConverterRef)) {
263+
beanDefinitionBuilder.addPropertyReference("jobParametersConverter", jobParametersConverterRef);
264+
}
265+
260266
registry.registerBeanDefinition("jobOperator", beanDefinitionBuilder.getBeanDefinition());
261267
}
262268

Diff for: spring-batch-core/src/main/java/org/springframework/batch/core/configuration/annotation/EnableBatchProcessing.java

+8
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.springframework.batch.core.configuration.support.ApplicationContextFactory;
2929
import org.springframework.batch.core.configuration.support.AutomaticJobRegistrar;
3030
import org.springframework.batch.core.configuration.support.ScopeConfiguration;
31+
import org.springframework.batch.core.converter.JobParametersConverter;
3132
import org.springframework.batch.core.launch.JobLauncher;
3233
import org.springframework.batch.core.launch.support.TaskExecutorJobLauncher;
3334
import org.springframework.batch.core.repository.JobRepository;
@@ -272,4 +273,11 @@
272273
*/
273274
String conversionServiceRef() default "conversionService";
274275

276+
/**
277+
* Set the {@link JobParametersConverter} to use in the job operator.
278+
* @return the bean name of the job parameters converter to use. Defaults to
279+
* {@literal jobParametersConverter}
280+
*/
281+
String jobParametersConverterRef() default "jobParametersConverter";
282+
275283
}

Diff for: spring-batch-core/src/main/java/org/springframework/batch/core/configuration/support/DefaultBatchConfiguration.java

+12
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import org.springframework.batch.core.configuration.BatchConfigurationException;
2828
import org.springframework.batch.core.configuration.JobRegistry;
2929
import org.springframework.batch.core.converter.DateToStringConverter;
30+
import org.springframework.batch.core.converter.DefaultJobParametersConverter;
31+
import org.springframework.batch.core.converter.JobParametersConverter;
3032
import org.springframework.batch.core.converter.LocalDateTimeToStringConverter;
3133
import org.springframework.batch.core.converter.LocalDateToStringConverter;
3234
import org.springframework.batch.core.converter.LocalTimeToStringConverter;
@@ -237,6 +239,7 @@ public JobOperator jobOperator(JobRepository jobRepository, JobExplorer jobExplo
237239
jobOperatorFactoryBean.setJobExplorer(jobExplorer);
238240
jobOperatorFactoryBean.setJobRegistry(jobRegistry);
239241
jobOperatorFactoryBean.setJobLauncher(jobLauncher);
242+
jobOperatorFactoryBean.setJobParametersConverter(getJobParametersConverter());
240243
try {
241244
jobOperatorFactoryBean.afterPropertiesSet();
242245
return jobOperatorFactoryBean.getObject();
@@ -465,6 +468,15 @@ protected TaskExecutor getTaskExecutor() {
465468
return new SyncTaskExecutor();
466469
}
467470

471+
/**
472+
* Return the {@link JobParametersConverter} to use in the job operator. Defaults to
473+
* {@link DefaultJobParametersConverter}
474+
* @return the {@link JobParametersConverter} to use in the job operator.
475+
*/
476+
protected JobParametersConverter getJobParametersConverter() {
477+
return new DefaultJobParametersConverter();
478+
}
479+
468480
/**
469481
* Return the conversion service to use in the job repository and job explorer. This
470482
* service is used to convert job parameters from String literal to typed values and

Diff for: spring-batch-core/src/test/java/org/springframework/batch/core/configuration/annotation/BatchRegistrarTests.java

+52
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828
import org.springframework.batch.core.JobKeyGenerator;
2929
import org.springframework.batch.core.configuration.JobRegistry;
3030
import org.springframework.batch.core.configuration.support.JobRegistrySmartInitializingSingleton;
31+
import org.springframework.batch.core.converter.DefaultJobParametersConverter;
32+
import org.springframework.batch.core.converter.JobParametersConverter;
33+
import org.springframework.batch.core.converter.JsonJobParametersConverter;
3134
import org.springframework.batch.core.explore.JobExplorer;
3235
import org.springframework.batch.core.launch.JobLauncher;
3336
import org.springframework.batch.core.launch.JobOperator;
@@ -204,6 +207,31 @@ public void testCustomJobKeyGeneratorConfiguration() {
204207
jobKeyGenerator.getClass());
205208
}
206209

210+
@Test
211+
@DisplayName("When no JobParametersConverter is provided the default implementation should be used")
212+
public void testDefaultJobParametersConverterConfiguration() {
213+
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JobConfiguration.class);
214+
215+
JobOperator jobOperator = context.getBean(JobOperator.class);
216+
JobParametersConverter jobParametersConverter = (JobParametersConverter) ReflectionTestUtils
217+
.getField(jobOperator, "jobParametersConverter");
218+
219+
Assertions.assertEquals(DefaultJobParametersConverter.class, jobParametersConverter.getClass());
220+
}
221+
222+
@Test
223+
@DisplayName("When a custom JobParametersConverter implementation is found then it should be used")
224+
public void testCustomJobParametersConverterConfiguration() {
225+
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
226+
CustomJobParametersConverterConfiguration.class);
227+
228+
JobOperator jobOperator = context.getBean(JobOperator.class);
229+
JobParametersConverter jobParametersConverter = (JobParametersConverter) ReflectionTestUtils
230+
.getField(jobOperator, "jobParametersConverter");
231+
232+
Assertions.assertEquals(JsonJobParametersConverter.class, jobParametersConverter.getClass());
233+
}
234+
207235
@Configuration
208236
@EnableBatchProcessing
209237
public static class JobConfigurationWithoutDataSource {
@@ -328,6 +356,30 @@ public String generateKey(Object source) {
328356

329357
}
330358

359+
@Configuration
360+
@EnableBatchProcessing
361+
public static class CustomJobParametersConverterConfiguration {
362+
363+
@Bean
364+
public DataSource dataSource() {
365+
return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.HSQL)
366+
.addScript("/org/springframework/batch/core/schema-hsqldb.sql")
367+
.generateUniqueName(true)
368+
.build();
369+
}
370+
371+
@Bean
372+
public JdbcTransactionManager transactionManager(DataSource dataSource) {
373+
return new JdbcTransactionManager(dataSource);
374+
}
375+
376+
@Bean
377+
public JobParametersConverter jobParametersConverter() {
378+
return new JsonJobParametersConverter();
379+
}
380+
381+
}
382+
331383
private PlatformTransactionManager getTransactionManagerSetOnJobRepository(JobRepository jobRepository) {
332384
Advised target = (Advised) jobRepository; // proxy created by
333385
// AbstractJobRepositoryFactoryBean

0 commit comments

Comments
 (0)