代码之家  ›  专栏  ›  技术社区  ›  Vicky

Spring批处理:将列名作为平面文件中的第一行写入

  •  10
  • Vicky  · 技术社区  · 13 年前

    我想创建一个具有以下格式的平面文件:

    Col1Name;Col2Name;Col3Name
    one;23;20120912
    two;28;20120712
    

    如图所示,平面文件中的第一行是列名。

    如何通过头回调来实现这一点?

    我看到,如果输入文件是上面的格式,那么有一个选项可以忽略第一行:

    <property name="firstLineIsHeader" value="true"/>
    

    此外,这个 Jira Issue 表示我想要的已实现并已关闭。然而,我找不到任何将第一行写成列名的例子。

    <beans:bean id="MyFileItemWriter" class="com.nik.MyFileItemWriter" scope="step">
        <beans:property name="delegate">
            <beans:bean class="org.springframework.batch.item.file.FlatFileItemWriter">
                <beans:property name="resource" value="file:MYFILE.dat" /> 
    
                <beans:property name="lineAggregator">
                    <beans:bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
                        <beans:property name="delimiter" value=";" />
                        <beans:property name="fieldExtractor">
                            <beans:bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
                                <beans:property name="names" value="Col1Name, Col2Name, Col3Name" />
                            </beans:bean>
                        </beans:property>
                    </beans:bean>
                </beans:property>
                <beans:property name="headerCallback" ref="MyFileItemWriter" />
            </beans:bean>
        </beans:property>
    </beans:bean>
    

    我的项目编写器如下所示:

    public class MyFileItemWriter implements ItemWriter<MyBean>, FlatFileHeaderCallback, ItemStream{
    
    private FlatFileItemWriter<MyBean> delegate;    
    
     public void setDelegate(final FlatFileItemWriter<MyBean> delegate) {
            this.delegate = delegate;
        }
    
    public void writeHeader(Writer writer) throws IOException {
    
    
    }
    
    public void write(List<? extends MyBean> items) throws Exception {
        this.delegate.write(items);
    
    }
    
    public void close() throws ItemStreamException {
         this.delegate.close();
    
    }
    
    public void open(ExecutionContext arg0) throws ItemStreamException {
         this.delegate.open(arg0);
    
    }
    
    public void update(ExecutionContext arg0) throws ItemStreamException {
         this.delegate.update(arg0);        
    }
    
    }
    

    感谢阅读!

    3 回复  |  直到 9 年前
        1
  •  17
  •   Salvatore Pannozzo Capodiferro    12 年前

    创建一个自定义类,该类扩展FlatFileItemWriter并仅实现构造函数:

    public class MyFlatFileWriter extends FlatFileItemWriter {
    
        public MyFlatFileWriter (){
            super.setHeaderCallback(new FlatFileHeaderCallback() {
    
                public void writeHeader(Writer writer) throws IOException {
                    writer.write("Col1Name,Col2Name,Col3Name");
    
                }
            });
        }
    

    然后在bean配置类属性中使用该类

        2
  •  6
  •   Michael Pralow    13 年前

    你试着和谁一起工作

      public void writeHeader(Writer writer) throws IOException {
          //... e.g. writer.write("my first line");
    
      } 
    
        3
  •  2
  •   Mohsin Mansoor    10 年前

    FlatFileItemWriter为您提供了添加标头回调的选项

    在将第一项写入文件之前,将调用headerCallback。

    因此,您需要通过实现 FlatFileHeaderCallback

    Use Default Implementation