使用FlatFileItemReader捕获读取行

时间:2012-09-05 09:10:02

标签: spring spring-batch

我正在使用FlatFileItemReader阅读csv文件并使用FieldSetMapper将其映射到域对象。

如果映射失败,我希望FlatFileItemReader能够读取原始行,以便我可以将其写入另一个csv文件。

我最初的想法是使用一些侦听器将读取字符串推送到StepContext,然后使用SkipListener来获取字符串以将其写入另一个文件。但我无法找到一种方法来捕捉FlatFileItemReader读取的原始行。

建议?

2 个答案:

答案 0 :(得分:2)

实现ItemReadListener接口的onReadError(Exception)方法正是您所需要的。

public void onReadError(Exception e) {
    if(e instanceof FlatFileParseException) {
        FlatFileParseException ffpe = (FlatFileParseException) e;
        ffpe.getLineNumber(); //The line number error occured
        ffpe.getInput();//Text value of the unparsed line
    }
}

答案 1 :(得分:1)

如果您的配置与Spring Batch Documentation for FlatFileItemReader类似,则可以使用自定义LineMapper而不是通常的DefaultLineMapper,这会抛出丰富的异常

这是一些简单的示例代码

public class DefaultLineMapper<T> implements LineMapper<T>, InitializingBean {
    (...)

public T mapLine(String line, int lineNumber) throws Exception {
            try {
      return fieldSetMapper.mapFieldSet(tokenizer.tokenize(line));
            }
            catch (...) {
                throw new CustomException(line, lineNumber);
            }
}

}