3

我正在读取一个 csv 文件,FlatFileItemReader并使用 aFieldSetMapper将其映射到域对象。

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

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

建议?

4

2 回答 2

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
    }
}
于 2012-09-06T14:04:46.150 回答
1

如果您的配置类似于FlatFileItemReader 的 Spring Batch 文档,则可以使用自定义 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);
            }
}

}

于 2012-09-05T18:47:35.673 回答