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

如何创建继承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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:52:31