Spring batch 将CustomEditor与BeanRapperFieldDextractor一起使用,就像使用BeanRapperFieldSetMapper一样

Spring batch 将CustomEditor与BeanRapperFieldDextractor一起使用,就像使用BeanRapperFieldSetMapper一样,spring-batch,Spring Batch,我编写了一个简单的Spring批处理应用程序,它读取CSV文件,进行一些转换,并将修改后的CSV写入磁盘 将文件读入域对象就像一个符咒。我使用DelimitedLineTokenizer标记行,并使用BeanRapperFieldSetMapper将值输入bean: <bean id="reader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step"> <propert

我编写了一个简单的Spring批处理应用程序,它读取CSV文件,进行一些转换,并将修改后的CSV写入磁盘

将文件读入域对象就像一个符咒。我使用DelimitedLineTokenizer标记行,并使用BeanRapperFieldSetMapper将值输入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的功能,它可以“猜测”字段名,还可以定义CustomEditor,我用它来定义输入文件中使用的特殊日期和数字格式

现在我想以与输入文件相同的格式编写修改后的文件。 我使用以下配置:

<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>

在这种配置中,我遗漏了两件事:

<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>
  • BeanRapperFieldSetMapper允许我设置CustomEditor,但BeanRapperFieldDextractor没有这种可能性。有没有办法使用这些
  • 有没有办法定义文件第一行的标题?我还没有找到任何方法来写一个不是bean的初始行。。。最好在这里使用与BeanRapperFieldSetMapper相同的名称,以便BeanRapperFieldDextractor像BeanRapperFieldSetMapper那样编写初始行并猜测bean属性名称
  • 在SpringBatch中加载文件的过程非常舒适。为什么文件的编写如此不同?我错过什么了吗

    我必须使用SpringBatch 2.1.x,因为我们使用的是Spring3.0.x。因此,升级到2.2.x将不是一个选项

  • 你需要什么?将字段属性提取为文本?你可以
    • 如果您的需要不太复杂,请使用
      FormatterLineAggregator

    • 编写您自己的
      CustomEditorsFieldExtractor
      (更好)
    • 生成由原始域对象和文本格式对象组成的复杂域对象,并使用最后一个作为writer的参数(但会中断当前处理器/writer)
  • 使用
    FlatFileItemWriter.headerCallback
    :如果设置允许自定义头写入

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

    我在1上尝试了你的第一个解决方案。格式字符串真的很难看(对于我的真实数据bean,不是上面的例子):
    似乎我必须实现自己的提取器。这真的很烦人,因为定义一些CustomEditor会很简单。不明白为什么读取CSV是一个常见的用例,而编写CSV是一个特殊的用例;如果他们不提供这个提取器,可能会有一些严重的原因。。。如果你写下自己的摘录,与朋友分享;D好运气,论坛的问题和我的一样。但不幸的是,没有答案。无论如何,谢谢你。前两条建议适用于1。这可能取决于转换的复杂性。我没有接受,因为我没有机会核对答案。我今天就做。