如何创建继承FlatFileItemWriter的Spring Batch自定义CSV写入器
自定义FlatFileItemWriter实现CSV写入示例
FlatFileItemWriter本身已提供CSV写入的基础能力,自定义时通常通过扩展它实现特殊业务逻辑(比如自定义表头、字段格式化、特殊行处理等)。以下是可直接运行的完整示例:
1. 定义数据实体类
先创建一个简单的实体类,作为要写入CSV的数据对象:
public class User { private Long id; private String username; private Integer age; private String email; // 构造方法、getter和setter public User(Long id, String username, Integer age, String email) { this.id = id; this.username = username; this.age = age; this.email = email; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
2. 自定义FlatFileItemWriter子类
继承FlatFileItemWriter,自定义表头生成逻辑,并对特定字段(比如年龄)做格式化处理:
import org.springframework.batch.item.file.FlatFileItemWriter; import org.springframework.batch.item.file.transform.LineAggregator; import org.springframework.core.io.FileSystemResource; public class CustomCsvItemWriter extends FlatFileItemWriter<User> { public CustomCsvItemWriter() { // 设置输出文件路径 setResource(new FileSystemResource("output/users.csv")); // 自定义行聚合器,处理每行的CSV格式 setLineAggregator(createCustomLineAggregator()); // 开启表头写入 setHeaderCallback(writer -> writer.write("ID,用户名,年龄,邮箱")); } // 自定义行聚合器,将User对象转换为CSV行字符串 private LineAggregator<User> createCustomLineAggregator() { return user -> { // 对年龄字段做特殊处理:如果年龄小于18,显示"未成年" String ageStr = user.getAge() < 18 ? "未成年" : user.getAge().toString(); return String.join(",", user.getId().toString(), user.getUsername(), ageStr, user.getEmail() ); }; } // 自定义写入前的逻辑,可重写write方法 @Override public void write(java.util.List<? extends User> items) throws Exception { System.out.println("准备写入" + items.size() + "条数据到CSV文件"); super.write(items); } }
3. Spring Batch 作业配置类
配置Job、Step,以及测试用的ItemReader:
import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.support.ListItemReader; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.PlatformTransactionManager; import java.util.Arrays; import java.util.List; @Configuration @EnableBatchProcessing public class BatchConfig { // 测试用的ItemReader,生成模拟数据 @Bean public ItemReader<User> userItemReader() { List<User> users = Arrays.asList( new User(1L, "张三", 25, "zhangsan@example.com"), new User(2L, "李四", 17, "lisi@example.com"), new User(3L, "王五", 30, "wangwu@example.com") ); return new ListItemReader<>(users); } // 注册自定义Writer @Bean public CustomCsvItemWriter customCsvItemWriter() { return new CustomCsvItemWriter(); } // 配置Step @Bean public Step csvWriteStep(JobRepository jobRepository, PlatformTransactionManager transactionManager) { return new StepBuilder("csvWriteStep", jobRepository) .<User, User>chunk(2, transactionManager) .reader(userItemReader()) .writer(customCsvItemWriter()) .build(); } // 配置Job @Bean public Job csvWriteJob(JobRepository jobRepository, Step csvWriteStep) { return new JobBuilder("csvWriteJob", jobRepository) .start(csvWriteStep) .build(); } }
4. 启动类
创建Spring Boot启动类运行作业:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class BatchApplication { public static void main(String[] args) { SpringApplication.run(BatchApplication.class, args); } }
依赖说明
确保pom.xml(Maven)中包含以下依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies>
运行后,会在项目根目录的output/users.csv文件中生成如下内容:
ID,用户名,年龄,邮箱 1,张三,25,zhangsan@example.com 2,李四,未成年,lisi@example.com 3,王五,30,wangwu@example.com
内容的提问来源于stack exchange,提问作者AnotherBrick
相关产品推荐
相关产品推荐

