【问题标题】:Spring batch - How to write data multiple rows after processing single record?Spring Batch - 处理单条记录后如何写入多行数据?
【发布时间】:2017-04-24 14:31:18
【问题描述】:

我的 bean 类如下 -

public class Account {
    private String strAccNumber = "";

    private List<Account> accountList = new ArrayList<Account>();

     // getter setter
....
...
@Override
    public String toString() {
        // code for PassThroughLineAggregator
        String data="";
                    for (int j=0; j<accountList.size(); j++) {
            Account bean = accountList.get(j);
            data = data + bean.getStrAccNumber();
            if (j<(accountList.size()-1)) {
                data = data + "\n";
                                }       
        }
        return data;
    }
}

要写入数据,我想在我的配置文件中设置 accountList。 我正在使用下面的代码来设置 bean 属性。

  <bean id="flatFileReader" class="org.springframework.batch.item.file.FlatFileItemReader"
    scope="step">
    <property name="resource" value="classpath:springBatch.csv" />
    <property name="strict" value="false"></property>
    <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="names" value="ACC#" />
                </bean>
            </property>
            <property name="fieldSetMapper">
                <bean
                    class="com.abc.reader.AccountDetailsFieldSetMapper" />
            </property>
        </bean>
    </property>
</bean>
 <bean id="flatFileProcessor"
    class="com.abc.processor.AccountItemProcessor"
    scope="step"></bean>
<bean id="flatFileWriter"
        class="com.abc.FlatFileItemWriterListener"
        scope="step">
        <property name="resource" value="classpath:springBatch1.csv" />

        <property name="lineAggregator">
            <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
                <property name="fieldExtractor">
                    <bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
                        <property name="names" value="strAccNumber" />
                    </bean>
                </property>
            </bean>
        </property> 

    </bean>

AccountItemProcessor -

 public class AccountItemProcessor implements ItemProcessor<Account, List<Account>>{

@Override
public List<Account> process(Account accObj) throws Exception {
  // logic..
}

在处理步骤中处理单个记录后,我想编写多个项目(项目列表),如何使用 arraylist 一次编写多个项目。就我而言,我想从 accountlist 中写入数据。

【问题讨论】:

  • 请告诉我您的阅读器和处理器。我们将看看 Writer 的最佳选择是什么
  • @NghiaDo : 请查看更新后的代码

标签: java spring-batch flatfilereader


【解决方案1】:

您需要实现自己的LineAggregator。这就是将String 写入文件的原因。在您的情况下,您将编写一个返回真正多行的String

您可以在此处的文档中阅读有关LineAggregator 接口的更多信息:http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/item/file/transform/LineAggregator.html

【讨论】:

  • 我试过 PassThroughLineAggregator,在 xls 中得到空白 []
  • 如你所愿。您需要为此用例实现自己的。
  • 是的..它现在正在使用 PassThroughLineAggregator 但问题是我的数据是否包含下一行(\n)数据拆分并写入下一行 csv
  • 如果您不想将 \n 用作新行,则需要像其他任何时候将 \n 写入文件一样对其进行转义。跨度>
最近更新 更多