You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:44:59