首页 文章

具有列表的Spring Batch 3自定义编写器

提问于
浏览
0

想象一下Menu.java pojo有3个字段:id,name和telephone .

我正在使用Spring Batch 3.我的处理器返回一个List . 我想在文件上写下列表中每个对象的这些值 .

如果Menu不是列表,那么这将是我的编写者类:

@Bean(name="MyWriter")
@SphynxBatchStepScope
public FlatFileItemWriter<Menu> myWriter() String fileOutputName) {

    FlatFileItemWriter<Menu> writer = new FlatFileItemWriter<Menu>();   
    writer.setResource(new FileSystemResource("test.txt")));
    DelimitedLineAggregator<Menu> delLineAgg = new DelimitedLineAggregator<Menu>();
    delLineAgg.setDelimiter("          ");
    BeanWrapperFieldExtractor<Menu> fieldExtractor = new BeanWrapperFieldExtractor<Menu>();
    fieldExtractor.setNames(new String[] {"id", "name", "telephone"});
    delLineAgg.setFieldExtractor(fieldExtractor);
    writer.setLineAggregator(delLineAgg);
    writer.setHeaderCallback(header());
    writer.setFooterCallback(footer());
    writer.setEncoding("UTF-8");

    return writer;
}

但是,如果我想将这个类转换为使用List,我该怎么办呢?

我找不到任何解决方案 . 只有这个:

Using an ItemWriter with List of Lists

但我不知道如何实现这一点 . 例如,在何处以及如何调用setDelegate方法 . 或者当我需要把我的“id”,“名字”,“电话”序列 .

请问,有没有人知道带有List的自定义Writer的代码示例?

提前致谢

1 回答

  • 0

    你的作家将保持原样,但被 ListUnpackingItemWriter 包裹 .

    // NOTE: this will now be the delegate used by the delegating writer.
    // It will be injected to the delegating writer.
    @Bean(name="MyDelegateWriter")
    @SphynxBatchStepScope
    public FlatFileItemWriter<Menu> myWriter(String fileOutputName) {
    
        FlatFileItemWriter<Menu> writer = new FlatFileItemWriter<Menu>();   
        writer.setResource(new FileSystemResource("test.txt")));
        DelimitedLineAggregator<Menu> delLineAgg = new DelimitedLineAggregator<Menu>();
        delLineAgg.setDelimiter("          ");
        BeanWrapperFieldExtractor<Menu> fieldExtractor = new BeanWrapperFieldExtractor<Menu>();
        fieldExtractor.setNames(new String[] {"id", "name", "telephone"});
        delLineAgg.setFieldExtractor(fieldExtractor);
        writer.setLineAggregator(delLineAgg);
        writer.setHeaderCallback(header());
        writer.setFooterCallback(footer());
        writer.setEncoding("UTF-8");
    
        return writer;
    }
    
    // NOTE: now this "MyWriter" will be used by your job
    @Bean(name="MyWriter")
    @SphynxBatchStepScope
    public ListUnpackingItemWriter(@Qualifier("MyDelegateWriter") FlatFileItemWriter<Menu> delegate) {
        ListUnpackingItemWriter<List<Menu>> writer = new ListUnpackingItemWriter<>();
        writer.setDelegate(delegate);
        return writer;
    }
    

相关问题