【问题标题】:How can I get the number of line and the filename in itemProcessor - spring batch如何获取 itemProcessor 中的行数和文件名 - 春季批处理
【发布时间】:2013-02-04 02:11:34
【问题描述】:

我正在使用 Spring Batch 来解析我的文件。在 ItemProcessor 中,我验证传入字段是否正确。如果不是,我想抛出 ValidationException 并将具有不正确字段的相应行记录到文件中。那么,如何在 ItemProcessor 中找到行数和文件名呢?

【问题讨论】:

    标签: spring batch-processing


    【解决方案1】:

    至于行号,您可以构建自己的 LineMapper,然后将行号存储在您的业务对象中。我将未处理的行(原样)与行号一起存储的示例:

        DefaultLineMapper<OneRow> lineMapper = new DefaultLineMapper<OneRow>() {
            @Override
            public OneRow mapLine(String line, int lineNumber) throws Exception {
                return new OneRow(lineNumber, line);
            }
        };
    

    当然,您已经可以映射您的对象,我需要将整行未经处理作为我的处理器的输入。

    作为相同想法的参考:https://stackoverflow.com/a/23770421/5658642

    【讨论】:

      【解决方案2】:

      没有看到您的 ItemReader 配置,我无法确定,但如果您使用 FlatFileItemReader 之类的东西来解析 csv,如果在严格模式下,它将验证列数。

      假设你的读者长这样,那就是:

      <bean id="iItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
          <property name="linesToSkip" value="1"/>
          <property name="comments" value="#" />
          <property name="encoding" value="UTF-8"/>
          <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">
                              <list >
                                  <value>First_Field</value>
                              <value>Second_Field</value>
                              </list>
                          </property>
                          <property name="strict" value="true"/>
                      </bean>
                  </property>
                  <property name="fieldSetMapper">
                      <bean class="uk.co.package.FieldSetMapper">
                          <property name="dateFormat" value="yyyy-MM-dd HH:mm:ss"/>
                      </bean>
                  </property>
              </bean>
          </property>
      
      </bean>
      

      它将为任何无法处理的行抛出一个 FlatFileParseException。这包括行号,可以在侦听器中处理。

      【讨论】:

      • 感谢您的回答!我使用此配置来捕获将在 flatFileItemReader 中发生的异常。但是,行字段的验证是从 itemProcessor 执行的。例如,在 itemProcessor 中,我检查第一个字符串是否由 10 个字符组成,第二个字段是属于特定字符串列表的字符串。您向我建议的是在从行创建对象期间在 fieldSetMapper 中传输验证,以便捕获 flatFileItemReaderException?
      • 我建议将您的验证移到 fieldSetMapper 中,但另一种方法可能是计算 ItemProcessor 中的行数(假设它的步骤范围)并将文件名存储在 executioncontext 中,以便它可用于整个工作。
      猜你喜欢
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 2015-06-11
      • 2020-08-20
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 2014-12-15
      相关资源
      最近更新 更多