我编写了一个简单的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 的功能来“猜测”字段名称和定义 CustomEditors 的可能性,我用它来定义用于的特殊日期和数字格式输入文件。
现在我想以与输入文件相同的格式编写修改后的文件。 我使用以下配置:
<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>
我想念这个配置有两件事:
在Spring Batch中加载文件的过程非常舒服。为什么文件的写入如此不同?我错过了什么吗?
我必须使用Spring Batch 2.1.x,因为我们使用的是Spring 3.0.x.因此,升级到2.2.x不是一种选择。
答案 0 :(得分:2)
FormatterLineAggregator
CustomEditorsFieldExtractor
(更好)FlatFileItemWriter.headerCallback
:如果设置允许自定义标题写入写作 - 在你的情况下 - 似乎是一个痛苦的尊重读取过程,因为spring-batch的阅读组件符合你的需要。
标准组件适合更多用途的用例,它们涵盖了很多场景。我们有时会写一个自定义的FieldExtractor! :)