0

我编写了一个简单的 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>

这个配置有两件事我想念:

  1. BeanWrapperFieldSetMapper允许我设置CustomEditors,但BeanWrapperFieldExtractor没有这种可能性。有没有办法使用这些?
  2. 有没有办法在文件的第一行定义标题?我还没有找到任何方法来编写不是 bean 的初始行......在这里使用与BeanWrapperFieldSetMapper相同的名称会很棒,这样BeanWrapperFieldExtractor会写入初始行并猜测BeanWrapperFieldSetMapper所做的 bean 属性名称。

在 Spring Batch 中加载文件的过程非常舒适。为什么文件的写入如此不同?我错过了什么吗?

我必须使用 Spring Batch 2.1.x 因为我们使用的是 Spring 3.0.x 。因此不能选择升级到 2.2.x。

4

1 回答 1

2
  1. 你需要哪个?将字段属性提取为文本?你可以
    • FormatterLineAggregator如果您的需要不太复杂,请使用 a
    • 自己写CustomEditorsFieldExtractor(更好)
    • 生成一个由原始域对象和文本格式对象组成的复杂域对象,并使用最后一个作为 writer 的参数(但会破坏您当前的处理器/writer)
  2. 使用FlatFileItemWriter.headerCallback:如果设置允许自定义标题写入

写作 - 在你的情况下 - 似乎是一个痛苦的阅读过程,因为 spring-batch 的阅读组件符合你的需要。
标准组件适合更多使用的用例,它们涵盖了很多场景。有时让我们编写一个自定义的 FieldExtractor!:)

于 2013-08-08T09:11:35.730 回答