Spring Batch 5 RC1自定义类型转换器注册失败求助
解决Spring Batch 5 RC1中自定义GenericConverter注册问题
1. 注册Spring Batch专属ConversionService
Spring Batch 5会创建独立的GenericConversionService实例,不会复用Web层或全局转换器。不要用@PostConstruct修改默认配置,直接覆盖createConversionService方法来注册自定义转换器:
@Configuration public class BatchConfig extends DefaultBatchConfiguration { @Override protected ConversionService createConversionService() { GenericConversionService conversionService = new GenericConversionService(); // 添加自定义GenericConverter conversionService.addConverter(new FileProviderToStringConverter()); // 必须添加Spring Batch默认转换器,避免丢失原有功能 DefaultConversionService.addDefaultConverters(conversionService); // 按需添加Spring核心默认转换器(如日期、集合转换) org.springframework.core.convert.support.DefaultConversionService.addDefaultConverters(conversionService); return conversionService; } }
2. JobParameters转换的特殊处理
如果FileProvider作为JobParameter传递,需配置JobParametersConverter(Job参数转换逻辑独立于ConversionService):
自定义JobParametersConverter实现
public class CustomJobParametersConverter extends DefaultJobParametersConverter { private final ConversionService conversionService; public CustomJobParametersConverter(ConversionService conversionService) { this.conversionService = conversionService; } @Override public JobParameters getJobParameters(Properties properties) { JobParametersBuilder builder = new JobParametersBuilder(); for (Map.Entry<Object, Object> entry : properties.entrySet()) { String key = entry.getKey().toString(); Object value = entry.getValue(); if (value instanceof FileProvider) { builder.addString(key, conversionService.convert(value, String.class)); } else { // 复用默认逻辑处理其他参数类型 super.addParameter(builder, key, value); } } return builder.toJobParameters(); } @Override public Properties getProperties(JobParameters jobParameters) { Properties properties = super.getProperties(jobParameters); // 反向转换(从JobParameters还原FileProvider,按需实现) for (Map.Entry<String, JobParameter> entry : jobParameters.getParameters().entrySet()) { JobParameter parameter = entry.getValue(); if (parameter.getType() == JobParameterType.STRING) { String value = parameter.getValue().toString(); properties.put(entry.getKey(), conversionService.convert(value, FileProvider.class)); } } return properties; } }
在Batch配置中注册自定义转换器
@Configuration public class BatchConfig extends DefaultBatchConfiguration { @Override protected JobParametersConverter createJobParametersConverter() { return new CustomJobParametersConverter(createConversionService()); } // 保留之前的createConversionService方法 }
3. 作业/步骤构建器的局部配置
如果仅特定作业/步骤需要转换器,可在构建器中直接关联:
@Bean public Job sampleJob(JobRepository jobRepository, Step sampleStep) { return JobBuilderFactory.get("sampleJob") .repository(jobRepository) .start(sampleStep) .build(); } @Bean public Step sampleStep(JobRepository jobRepository, PlatformTransactionManager transactionManager, ConversionService conversionService) { return StepBuilderFactory.get("sampleStep") .repository(jobRepository) .transactionManager(transactionManager) .<Input, Output>chunk(10) .reader(itemReader()) .processor(new CustomItemProcessor(conversionService)) .writer(itemWriter()) .build(); } // 自定义ItemProcessor中直接注入使用ConversionService class CustomItemProcessor implements ItemProcessor<Input, Output> { private final ConversionService conversionService; public CustomItemProcessor(ConversionService conversionService) { this.conversionService = conversionService; } @Override public Output process(Input item) throws Exception { // 直接使用转换器处理类型转换 String fileProviderStr = conversionService.convert(item.getFileProvider(), String.class); // 业务逻辑处理 return new Output(fileProviderStr); } }
关键注意事项
- 不要混用WebMvc和Spring Batch的ConversionService,两者是独立实例;
- 覆盖
createConversionService时必须添加默认转换器,否则会丢失Spring Batch自带的转换能力; - Job参数的序列化/反序列化逻辑不依赖全局ConversionService,需单独配置
JobParametersConverter。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

