在Spring Boot 3.2+(Spring Batch 5.0+)中启用批处理需四步:1. 确保spring-boot-starter-batch与spring-boot-starter-data-jpa共存,改用jakarta.persistence-api和mysql-connector-j 8.3+;2. application.yml中设spring.batch.jdbc.initialize-schema: always;3. 显式声明名为transactionManager的PlatformTransactionManager Bean;4. 手动配置JobRepository、JobLauncher并用@Bean覆盖@EnableBatchProcessing默认bean。

在Spring Boot 5.0环境下快速启用Spring Batch批处理能力,需绕过自动配置陷阱、显式声明事务管理器、正确初始化元数据表,并适配Java 17+的模块化要求——这些步骤缺一不可,否则Job启动时会抛出NoSuchBeanDefinitionException或SchemaManagementException。
确认依赖与版本兼容性
打开pom.xml,确保使用Spring Boot 3.2+(对应Spring Batch 5.0+),【spring-boot-starter-batch必须与spring-boot-starter-data-jpa共存】,否则ItemWriter无法注入JPA事务上下文。
移除旧版javax.persistence-api依赖,改用jakarta.persistence-api:
MySQL驱动必须升级至mysql-connector-j 8.3+,否则连接池初始化失败。
强制初始化Batch元数据表
Spring Boot 3.x默认禁用schema自动创建,必须显式启用:
在application.yml中添加:
spring:
batch:
jdbc:
initialize-schema: always
datasource:
url: jdbc:mysql://localhost:3306/batch_meta?serverTimezone=Asia/Shanghai
【若使用H2内存库,必须同时开启h2.console.enabled=true,否则无法验证表是否生成成功】
启动应用后,手动访问http://localhost:8080/h2-console,用sa账号登录,执行SELECT * FROM BATCH_JOB_INSTANCE验证表已建好。
声明PlatformTransactionManager Bean
Spring Batch 5.0不再接受默认PlatformTransactionManager,必须手工定义:
在配置类中添加:
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
将 Spring Boot 2.7 项目升级到 Spring Boot 3.5 的实战流程,覆盖版本基线、依赖坐标替换、Jakarta 迁移、配置兼容、异步上下文传递改造与验证门禁。用于企业多模块 Maven 项目升级与排障。
该Bean名称必须为transactionManager,不能是txManager或其他别名,否则Step执行时抛出TransactionRequiredException。
配置JobRepository与JobLauncher
第一步:注入JobRepository并设置隔离级别
@Bean
public JobRepository jobRepository(DataSource dataSource, PlatformTransactionManager transactionManager)
throws Exception {
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setDataSource(dataSource);
factory.setTransactionManager(transactionManager);
factory.setIsolationLevelForCreate("ISOLATION_DEFAULT");
return factory.getObject();
}
第二步:构建JobLauncher,禁用默认同步模式
@Bean
public JobLauncher jobLauncher(JobRepository jobRepository) throws Exception {
SimpleJobLauncher launcher = new SimpleJobLauncher();
launcher.setJobRepository(jobRepository);
launcher.setTaskExecutor(new SyncTaskExecutor());
return launcher;
}
第三步:启用@EnableBatchProcessing注解,但必须配合@Bean方式覆盖其默认bean,否则JobBuilderFactory无法识别自定义transactionManager。
定义一个最小可运行Job
方法一:基于Chunk的文件读写Job
@Bean
public Job csvImportJob(JobRepository jobRepository, Step csvStep) {
return new JobBuilder("csvImportJob", jobRepository)
.start(csvStep)
.build();
}
方法二:纯内存数据处理Job(用于单元测试)
@Bean
public Job memoryTestJob(JobRepository jobRepository, Step memoryStep) {
return jobBuilderFactory.get("memoryTestJob")
.repository(jobRepository)
.start(memoryStep)
.build();
}
注意:Job名称必须唯一,重复定义会导致ApplicationContext refresh失败。

















