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
相关产品推荐
相关产品推荐

