Spring Batch中chunk(int)方法已废弃,求代码修改替代方案
Spring Batch 废弃
chunk方法的替代方案 你遇到的问题是Spring Batch中<Person, Person>chunk(3)这个带显式泛型的chunk方法已被标记为废弃,从Spring Batch 4.3版本开始,官方推荐使用无需显式指定泛型的写法,框架会通过后续的reader、processor和writer自动推断数据类型。同时你的代码中writer(null)的写法存在问题,会导致空指针异常,应该让Spring自动注入DataSource。
修改后的核心代码(step1方法)
@Bean public Step step1(ItemWriter<Person> writer) { // 让Spring自动注入writer,无需手动传参 return new StepBuilder("step1", jobRepository) .chunk(3) // 移除显式泛型声明,框架自动推断类型 .reader(reader()) .processor(processor()) .writer(writer) .transactionManager(transactionManager) .build(); }
完整修正后的代码
还需要补充Person类的getter/setter方法(BeanWrapperFieldSetMapper需要访问这些属性来完成映射),并修正writer的注入逻辑:
package batchprocessing; import org.springframework.batch.core.Job; import org.springframework.batch.core.JobBuilder; import org.springframework.batch.core.Step; import org.springframework.batch.core.StepBuilder; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.batch.core.configuration.annotation.StepScope; import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.item.ItemWriter; import org.springframework.batch.item.file.FlatFileItemReader; import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder; import org.springframework.batch.item.support.ValidatingItemProcessor; import org.springframework.batch.item.validator.SpringValidator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; import javax.sql.DataSource; @Configuration @EnableBatchProcessing public class BatchConfiguration { private final JobRepository jobRepository; private final PlatformTransactionManager transactionManager; public BatchConfiguration(JobRepository jobRepository, PlatformTransactionManager transactionManager) { this.jobRepository = jobRepository; this.transactionManager = transactionManager; } @Bean @StepScope public FlatFileItemReader<Person> reader() { return new FlatFileItemReaderBuilder<Person>() .name("personItemReader") .resource(new ClassPathResource("sample-data.csv")) .delimited() .names("prhoin", "nrhoin") .fieldSetMapper(new BeanWrapperFieldSetMapper<>() {{ setTargetType(Person.class); }}) .build(); } @Bean public ValidatingItemProcessor<Person> processor() { ValidatingItemProcessor<Person> validatingItemProcessor = new ValidatingItemProcessor<>(); validatingItemProcessor.setValidator(new SpringValidator<>()); return validatingItemProcessor; } @Bean public LocalValidatorFactoryBean validator() { return new LocalValidatorFactoryBean(); } @Bean public ItemWriter<Person> writer(DataSource dataSource) { JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); return items -> { for (Person item : items) { jdbcTemplate.update("INSERT INTO people (prhoin, nrhoin) VALUES (?, ?)", item.getPrhoin(), item.getNrhoin()); // 使用getter方法 } }; } @Bean public Step step1(ItemWriter<Person> writer) { return new StepBuilder("step1", jobRepository) .chunk(3) // 移除废弃的泛型声明 .reader(reader()) .processor(processor()) .writer(writer) .transactionManager(transactionManager) .build(); } @Bean public Job runJob() { return new JobBuilder("importUserJob", jobRepository) .incrementer(new RunIdIncrementer()) .start(step1(writer(dataSource()))) .build(); } @Bean public DriverManagerDataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("your.driver.class"); dataSource.setUrl("your.jdbc.url"); dataSource.setUsername("your.username"); dataSource.setPassword("your.password"); return dataSource; } public static class Person { private String prhoin; private String nrhoin; // 补充getter和setter方法 public String getPrhoin() { return prhoin; } public void setPrhoin(String prhoin) { this.prhoin = prhoin; } public String getNrhoin() { return nrhoin; } public void setNrhoin(String nrhoin) { this.nrhoin = nrhoin; } } }
关键修改点说明
- 移除
.<Person, Person>chunk(3)中的泛型声明,改为直接调用chunk(3),框架会通过reader()返回的FlatFileItemReader<Person>自动推断输入类型,通过processor()和writer()推断输出类型。 - 修正
writer的注入方式:在step1()方法中添加ItemWriter<Person> writer参数,让Spring自动注入实例,避免手动传null导致的空指针异常。 - 为
Person类补充getter/setter方法,确保BeanWrapperFieldSetMapper能正确完成CSV字段到实体类属性的映射。
内容的提问来源于stack exchange,提问作者Laure Dev
相关产品推荐
相关产品推荐

