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

Spring Batch FlatFileItemWriter如何写入含List字段的对象到指定表头CSV

解决方案

你当前使用的BeanWrapperFieldExtractor仅支持直接映射POJO的简单属性,无法实现列表拆分、多字段映射的自定义逻辑,你只需要自定义FieldExtractor实现你的业务规则即可,完整实现如下:

1. 自定义Student字段提取器

import org.springframework.batch.item.file.transform.FieldExtractor;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class StudentFieldExtractor implements FieldExtractor<Student> {
    // 多余兴趣的分隔符,可根据需求调整
    private static final String ADDITIONAL_DELIMITER = ";";

    @Override
    public Object[] extract(Student student) {
        List<Object> fields = new ArrayList<>();
        // 前两列直接取属性
        fields.add(student.getName());
        fields.add(student.getAge());

        List<Interest> interests = student.getInterests();
        // 处理空列表场景
        if (interests == null) {
            interests = new ArrayList<>();
        }
        // 填充前3个兴趣列,不足补空
        for (int i = 0; i < 3; i++) {
            if (i < interests.size()) {
                fields.add(interests.get(i).getName());
            } else {
                fields.add(null);
            }
        }
        // 处理多余的兴趣,合并到附加列
        if (interests.size() > 3) {
            String additional = interests.subList(3, interests.size())
                    .stream()
                    .map(Interest::getName)
                    .collect(Collectors.joining(ADDITIONAL_DELIMITER));
            fields.add(additional);
        } else {
            fields.add(null);
        }
        return fields.toArray();
    }
}

2. 修改FlatFileItemWriter配置

替换原有配置里的BeanWrapperFieldExtractor为上面自定义的提取器即可:

public FlatFileItemWriter<Student> writer() {
    FlatFileItemWriter<Student> writer = new FlatFileItemWriter<>();
    writer.setResource(outputResource);
    writer.setAppendAllowed(true);
    writer.setLineAggregator(new DelimitedLineAggregator<Student>() {
        {
            setDelimiter(",");
            // 替换为自定义的字段提取器
            setFieldExtractor(new StudentFieldExtractor());
        }
    });
    return writer;
}

补充说明

  • 如果你的CSV字段值本身可能包含逗号,建议同时配置引号包裹逻辑,避免列错位。
  • 多余兴趣的拼接分隔符可根据业务需求自行调整,不需要和示例保持一致。
  • 你已经提前设置了表头,因此不需要再给writer配置表头输出逻辑,原有追加逻辑可正常生效。

内容的提问来源于stack exchange,提问作者Novacean Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:45:02