我正在读取一个 csv 文件,FlatFileItemReader
并使用 aFieldSetMapper
将其映射到域对象。
如果映射失败,我希望FlatFileItemReader
我可以随意读取原始行,以便将其写入另一个 csv 文件。
我最初的想法是使用一些侦听器将读取的字符串推送到StepContext
然后SkipListener
获取字符串以将其写入另一个文件。但我找不到方法来捕捉FlatFileItemReader
.
建议?
我正在读取一个 csv 文件,FlatFileItemReader
并使用 aFieldSetMapper
将其映射到域对象。
如果映射失败,我希望FlatFileItemReader
我可以随意读取原始行,以便将其写入另一个 csv 文件。
我最初的想法是使用一些侦听器将读取的字符串推送到StepContext
然后SkipListener
获取字符串以将其写入另一个文件。但我找不到方法来捕捉FlatFileItemReader
.
建议?
实现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
}
}
如果您的配置类似于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);
}
}
}