如何处理异常并跳过错误的csv行



我正在使用Spring batch读取csv文件。我正在读取csv的内容,并根据entity类之一将该内容写入数据库。

现在csv中可能有某些行是错误的,与POJO属性不匹配。为了处理这个问题,我将Step配置如下:

Step step = stepBuilderFactory.get("CSV-Step")
.<Book, Book>chunk(100)
.faultTolerant()
.skip(FlatFileParseException.class)
.skipLimit(1)
.reader(itemReader)
.writer(itemWriter)
.build();

它基本上跳过了导致FlatFileParseException的行,并继续执行后续行。现在,我还想记录那些无法进行解析的行。为此,在我用@ControllerAdvice注释的GlobalExceptionHandler中,我采用了以下方法:

@OnReadError
public void handleCsvParseException(FlatFileParseException ex, Throwable throwable) {
logger.error("! FlatFileParseException, line  is: " + ex.getLineNumber());
logger.error("! FlatFileParseException, input is: " + ex.getInput());
logger.error("! Message: " + throwable.getMessage());
logger.error("! Cause: " + throwable.getCause());
}

问题是这个方法没有被调用,因为我的Step中有skip配置。我如何才能忽略不需要的行,即跳过不需要的线,但同时记录有关它们的信息。如果有任何帮助,我都将不胜感激。

SkipListener就是您所需要的。每当在读取、处理或写入项目期间发生配置的可跳过异常时,就会调用此侦听器。

在您的情况下,您可以在SkipListener#onSkipInRead(Throwable t);方法中实现日志记录逻辑。FlatFileParseException将作为参数传递,并将为您提供必要的上下文(行号和原始输入(。

希望这能有所帮助。

最新更新