【问题标题】:Spring Batch FlatFileItemWriter - Write Object with List as fields to CSV fileSpring Batch FlatFileItemWriter - 将带有列表的对象作为字段写入 CSV 文件
【发布时间】:2021-09-15 16:28:16
【问题描述】:

我有以下 Pojo 课程:

public class Student {
    String name;
    Integer age;
    List<Interest> interests;
}

public class Interest {
    String name;
    Date createdAt;
}

我有以下带有标题的 CSV 文件:

NAME,AGE,INTEREST_1,INTEREST_2,INTEREST_3,INTERESTS_ADDITIONAL

是否有可能有一个 FlatFileItemWriter 可以根据该标头写入 csv 文件?

每个学生兴趣列表中的前 3 个兴趣将进入第 3、第 4 和第 5 列,如果列表中超过 3 个,只需将他们的名字添加到第 6 列。

到目前为止,我一直使用类似这样的 FlatFileItemWriter:

public FlatFileItemWriter<Student> writer() {
    FlatFileItemWriter<Student> writer = new FlatFileItemWriter<>();
    writer.setResource(outputResource);
    writer.setAppendAllowed(true);
    writer.setLineAggregator(new DelimitedLineAggregator<Student>() {
      {
          setDelimiter(",");
          setFieldExtractor(new BeanWrapperFieldExtractor<Student>() {
              {
                  setNames(new String[] { "name", "age", "interest" });
              }
          });
      }
    });
    return writer;
}

但这不适用于兴趣列表。 任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 只需编写您自己的自定义LineAggregator 来执行此操作,或使用ItemProcessorStudentInterest 转换为另一个与您要编写的CVS 匹配的java 类,然后使用常规的FlatFileItemWriter 配置。

标签: java spring spring-batch


【解决方案1】:

您可以编写自定义FieldExtactor 以根据需要提取字段。这是一个简单的例子:

@Bean
public FlatFileItemWriter<Student> itemWriter() {
    FlatFileItemWriter<Student> writer = new FlatFileItemWriter<>();
    writer.setResource(outputResource);
    writer.setAppendAllowed(true);
    writer.setLineAggregator(new DelimitedLineAggregator<Student>() {
        {
            setDelimiter(",");
            setFieldExtractor(new FieldExtractor<Student>() {
                @Override
                public Object[] extract(Student student) {
                    List<Object> fields = new ArrayList<>();
                    fields.add(student.getName());
                    fields.add(student.getAge());
                    // add interests as needed to the list
                    return fields.toArray();
                }
            });
        }
    });
    return writer;
}

【讨论】:

  • 谢谢,自定义 FieldExtractor 方法有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
相关资源
最近更新 更多