0

私は、CSV ファイルを読み取り、いくつかの変換を行い、変更された CSV をディスクに書き込む単純な Spring Batch アプリケーションを作成しました。

ドメインオブジェクトへのファイルの読み取りは、魅力のように機能します。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>

この構成で見逃していることが 2 つあります。

  1. BeanWrapperFieldSetMapperではCustomEditorsを設定できましたが、BeanWrapperFieldExtractorにはそのような可能性はありません。これらを使用する方法はありますか?
  2. ファイルの最初の行で見出しを定義する方法はありますか? Bean ではない最初の行を記述する方法が見つかりませんでした... BeanWrapperFieldSetMapper と同じ名前をここで使用して、BeanWrapperFieldExtractorが最初の行を書き込み、 BeanWrapperFieldSetMapperと同じように Bean プロパティの名前を推測できるようにするとよいでしょ

ファイルをロードするプロセスは、Spring Batch では非常に快適です。ファイルの書き込みがなぜこんなに違うのですか?何か不足していますか?

Spring 3.0.x を使用しているため、Spring Batch 2.1.x を使用する必要があります。したがって、2.2.x へのアップグレードはオプションではありません。

4

1 に答える 1

2
  1. あなたのニーズはどれですか?フィールド プロパティをテキストとして抽出しますか? あなたはできる
    • FormatterLineAggregator複雑すぎない場合はa を使用してください
    • 自分で書くCustomEditorsFieldExtractor(より良い)
    • 元のドメイン オブジェクトとテキスト形式のオブジェクトで構成された複雑なドメイン オブジェクトを生成し、最後のオブジェクトを writer のパラメーターとして使用します (ただし、現在のプロセッサ/ライターは壊れます)。
  2. 使用FlatFileItemWriter.headerCallback: 設定されている場合、カスタム ヘッダーの書き込みを許可します

spring-batch の読み取りコンポーネントがニーズに合っているため、書き込み-あなたの場合-読み取りプロセスを尊重するのは苦痛のようです。
標準コンポーネントは、より使用されるユースケースに適合し、多くのシナリオをカバーします。時々、カスタム FieldExtractor を書きましょう! :)

于 2013-08-08T09:11:35.730 に答える