我编写了一个简单的 Spring Batch 应用程序,它读取 CSV 文件,进行一些转换并将修改后的 CSV 写入磁盘。
将文件读入域对象就像一个魅力。我使用DelimitedLineTokenizer对行进行标记,并使用BeanWrapperFieldSetMapper将值提供给 bean:
<bean id="reader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
<property name="resource" value="#{jobParameters['inputResource']}" />
<property name="linesToSkip" value="1" />
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer">
<bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<property name="delimiter" value=";" />
<property name="names"
value="ID,NAME,DESCRIPTION,PRICE,DATE" />
</bean>
</property>
<property name="fieldSetMapper">
<bean class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
<property name="targetType" value="myapp.MyDomainObject" />
<property name="customEditors">
<map>
<entry key="java.util.Date" value-ref="dateEditor" />
<entry key="java.math.BigDecimal" value-ref="numberEditor" />
</map>
</property>
</bean>
</property>
</bean>
</property>
</bean>
我特别喜欢BeanWrapperFieldSetMapper的功能,可以“猜测”字段名称以及定义自定义编辑器的可能性,我用它来定义输入文件中使用的特殊日期和数字格式。
现在我想以与输入文件相同的格式编写修改后的文件。我使用以下配置:
<bean id="writer" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
<property name="resource" value="#{jobParameters['outputResource']}" />
<property name="lineAggregator">
<bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
<property name="delimiter" value=";" />
<property name="fieldExtractor">
<bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
<property name="names" value="id,name,description,price,date" />
</bean>
</property>
</bean>
</property>
</bean>
这个配置有两件事我想念:
- BeanWrapperFieldSetMapper允许我设置CustomEditors,但BeanWrapperFieldExtractor没有这种可能性。有没有办法使用这些?
- 有没有办法在文件的第一行定义标题?我还没有找到任何方法来编写不是 bean 的初始行......在这里使用与BeanWrapperFieldSetMapper相同的名称会很棒,这样BeanWrapperFieldExtractor会写入初始行并猜测BeanWrapperFieldSetMapper所做的 bean 属性名称。
在 Spring Batch 中加载文件的过程非常舒适。为什么文件的写入如此不同?我错过了什么吗?
我必须使用 Spring Batch 2.1.x 因为我们使用的是 Spring 3.0.x 。因此不能选择升级到 2.2.x。