我正在使用FlatFileItemReader
阅读csv文件并使用FieldSetMapper
将其映射到域对象。
如果映射失败,我希望FlatFileItemReader
能够读取原始行,以便我可以将其写入另一个csv文件。
我最初的想法是使用一些侦听器将读取字符串推送到StepContext
,然后使用SkipListener
来获取字符串以将其写入另一个文件。但我无法找到一种方法来捕捉FlatFileItemReader
读取的原始行。
建议?
答案 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);
}
}
}