当前位置: 首页 > 知识库问答 >
问题:

ItemWriter没有按我希望的方式输出行

宋昕
2023-03-14

我写了一个Spring批处理作业,从数据库中读取,然后写入csv。

这项工作的工作,但不幸的是,在我的输出CSV文件,它只是把什么是在我的域对象的toString方法。

我真正想要的是bean中用逗号分隔的所有值。这就是为什么我在下面的ItemWriter中加入了分隔线聚合器。

但我认为我对DelimitedLineAggregator的理解是错误的。我以为LineAggregator用于输出,但现在我认为它用于输入数据。

@Bean
@StepScope
public ItemWriter<MasterList> masterListFileWriter(
        FileSystemResource masterListFile,
        @Value("#{stepExecutionContext}")Map<String, Object> executionContext) {

    FlatFileItemWriter<MasterList> writer = new FlatFileItemWriter<>();
    writer.setResource(masterListFile);
    DelimitedLineAggregator<MasterList> lineAggregator = new DelimitedLineAggregator<>();
    lineAggregator.setDelimiter(";");
    writer.setLineAggregator(lineAggregator);
    writer.setForceSync(true);
    writer.open(new ExecutionContext(executionContext));
    return writer;

}

两件事。

我可以更改什么来输出主列表域对象的所有值(用逗号分隔)?改变toString方法是唯一的方法吗?

也可以有人澄清一下LineAggregator在writer中的用法。我现在认为它是用来指定如何聚合来自读者的行的。是这样吗?

提前谢谢

共有1个答案

秦景福
2023-03-14

我通过给作者添加一个Beanwrap演员来解决这个问题。

@Bean
@StepScope
public ItemWriter<MasterList> masterListFileWriter(
        FileSystemResource masterListFile,
        @Value("#{stepExecutionContext}")Map<String, Object> executionContext) {

    FlatFileItemWriter<MasterList> writer = new FlatFileItemWriter<>();
    writer.setResource(masterListFile);

    DelimitedLineAggregator<MasterList> lineAggregator = new DelimitedLineAggregator<>();
    lineAggregator.setDelimiter(",");

    BeanWrapperFieldExtractor<MasterList> extractor = new BeanWrapperFieldExtractor<MasterList>();
    extractor.setNames(new String[] { "l2", "l2Name"});
    lineAggregator.setFieldExtractor(extractor);

    writer.setLineAggregator(lineAggregator);
    writer.setForceSync(true);

    writer.open(new ExecutionContext(executionContext));

    return writer;

}   
 类似资料:
  • 这是我的方法compute(),它接受月数: 要提供上下文, 余额:是员工每月初获得的固定月薪 我的输入示例如下: 如果比尔·乔布斯(BillJobs)是余额为54K的员工,每年从银行获得0%和1.2%的年利率,计算时间将超过13个月。我的期望输出应该是: 其中706933.71的余额是在调用compute方法时计算出来的,但是我最终得到 13个月后的余额为705852.63。

  • 扫描仪sc=新扫描仪(系统输入);字符串A=sc.nextLine();

  • 问题内容: 我正在为我的女友开发这款游戏,而现在我在同一个问题上停留了几天。基本上,我希望她能够按5次“ Gather Wood”按钮,然后在她第五次按该按钮后立即弹出“ Create Fire”按钮。 1.问题是,无论我尝试以哪种方式编程要显示在第五个按钮上的方法,它都不会显示。 我将不胜感激任何编码技巧或大家认为我可以做的任何清理当前代码的事情。 这是收集木纽扣 这是创建按钮 问题答案: 基本

  • 由于某些原因,在运行此代码时,我没有得到输出。我不明白为什么。我肯定这是基本的原因,但在我看来一切都是正确的。 下面是输出:

  • 我正在学习这个教程。net电影教程,我的模型中有两个简单的文件。 另一个是Visual Studio给我的帐户模型: 问题是......如果我再加上一句话 对于UserProfile类,我在迁移中没有得到任何更改。。。。这是因为迁移只更新MovieDBContext中的类。。。。因此,我必须补充如下内容: 问题是,在另一个项目中,我试图更新会计模型,并尝试了这个解决方案,但它没有工作......有

  • 当我触摸文本输入时,我希望键盘不会显示出来。如果我使用“keyboard.Dississ”,我会放松对文本输入的关注,我使用的是自定义键盘,它本身是我屏幕的一部分,所以我不希望任何键盘显示出来,而不会放松对文本输入的关注,任何解决方案都可以。我尝试使用库,但一次又一次地面临同样的问题,我该怎么办。这里是我使用的代码