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

时间:2018-11-17 01:21:07

标签: spring csv exception-handling spring-batch

我正在使用csv读取Spring batch文件。我正在读取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的行,并继续后面的行。现在,我还想记录无法进行解析的行。为此,我在GlobalExceptionHandler中用@ControllerAdvice进行了注释,我做了以下方法:

@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());
}

问题是未调用此方法,因为我在skip中具有Step配置。我如何忽略不想要的行,即跳过不想要的行,但同时记录有关它们的信息。我将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

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

希望这会有所帮助。