用于大量字段的Spring Batch BeanWrapperFieldExtractor

时间:2017-07-17 15:13:21

标签: spring spring-batch filewriter

我正在编写一个读取CSV文件的Spring Batch应用程序,执行一些转换并将修改后的CSV写入要发送到另一个批处理过程。

我的编写器配置如下所示:

 <beans:property name="lineAggregator">
<beans:bean class="org.springframework.batch.item.file.transform.FormatterLineAggregator">
        <beans:property name="fieldExtractor">
                <beans:bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
                 <beans:property name="names" value="column1, column2, column3, column4 ------ 322 fields " /> 
                </beans:bean>
            </beans:property>

            <beans:property name="format" value="%-8s%-12s%-11s%-16s" ----322 fields /> 
        </beans:bean>
    </beans:property>

我必须写大约322个字段。我无法让任何FormatterLineAggregator来完成我的工作。如果我写的格式如

<property name="format" value="%s;%s;%s;%s;%s;%s;%s;%f;%f;%s;%f;%f;%td.%tm.%​tY;%td.%tm.%<‌​tY;%s;%td.%tm.%&‌​lt;tY;%s;%s;%s;%s;%t‌​d.%tm.%tY" /> , 
它变得非常混乱,很难确保所有领域都是正确的。

我想到了3种不同的解决方案:

  1. 要么采用上述方法。

  2. 写一个CustomEditorFieldsExtractor但不知道在课堂上写什么以及如何格式化字段。 (较受欢迎)

  3. 使用&#34;非标准&#34; BeanIO框架jar,但我担心我的客户不同意这个解决方案。

  4. 有人可以提供一些意见吗。感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以通过以下方式继续解决方案#2:

  1. 外部化如何格式化bean类的每个属性(例如,在XML或文本文件中)
  2. 编写自定义LineAggregator并使其与第1点的指令配合使用
  3. class Aggregator implements LineAggregator<T> {
      private Map<String, String> propertyFormat;
    
      public String aggregate(T item) {
        final StringBuilder sb = new StringBuilder();
        for(final String property : propertyFormat.keySet()) {
          final String format = propertyFormat.get(property);
          final Object propertyValue = /* Extract property from item using Spring beans */;
          sb.append(String.format(format, propertyValue));
        }
        return sb.toString();
      }
    }