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

时间:2012-09-12 12:20:00

标签: java spring-batch spring-batch-admin

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

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 个答案:

答案 0 :(得分: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配置类属性

中使用此类

答案 1 :(得分:5)

您是否尝试使用

  public void writeHeader(Writer writer) throws IOException {
      //... e.g. writer.write("my first line");

  } 

答案 2 :(得分:1)

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

  

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

因此,您需要通过实施FlatFileHeaderCallback

来实施标题回调

Use Default Implementation