如何处理异常并跳过错误的CSV行? [英] How to handle exception and skip the wrong csv line as well?

查看:53
本文介绍了如何处理异常并跳过错误的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将作为参数传递,并将为您提供必要的上下文(行号和原始输入)。

希望这对您有帮助。

这篇关于如何处理异常并跳过错误的CSV行?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆