【问题标题】:How to skip particular column's values where they are empty in FlatFileItemReader<T>?如何跳过 FlatFileItemReader<T> 中为空的特定列的值?
【发布时间】:2018-07-02 09:41:06
【问题描述】:

当我在 Spring Batch 中读取 CSV 文件时,当特定列没有实际值时,它会在行中引发 BindException (typeMismatch)。

如何跳过它们?

【问题讨论】:

  • 您可以发布您的堆栈跟踪以及示例输入文件内容吗?

标签: java spring mongodb spring-mvc spring-batch


【解决方案1】:

我如下配置了我的 ItemReader:

弹簧配置:

@Bean
Step step1() {
    return stepBuilderFactory.get("step1")
            .listener(dataProcessor)
            .chunk(100)
            .faultTolerant()
            .reader(yourReader()).faultTolerant().skipPolicy(new ItemVerificationSkipper())
            .processor(dataProcessor)
            .writer(writer())
            .build();
}

重要的部分是添加一个skipPolicy:

reader(yourReader()).faultTolerant().skipPolicy(new ItemVerificationSkipper())

ItemVerificationSkipper.java

@Slf4j
public class ItemVerificationSkipper implements SkipPolicy {

    @Override
    public boolean shouldSkip(Throwable exception, int skipCount) throws SkipLimitExceededException {

            StringBuilder errorMessage = new StringBuilder();
            errorMessage
                    .append("Unexpected exception ")
                    .append(exception.toString())
//                    .append(ExceptionUtils.getStackFrames(exception))
                    .append("\n");
            log.error("{}", errorMessage.toString());
            return true;
    }

}

在进一步的 cmets 后编辑:

列值跳过所需的 RowMapper 实现:

配置:

itemReader.setRowMapper(new CustomRowMapper());

CustomRowMapper.java

public class CustomRowMapper implements RowMapper<YourClass> {

    @Override
    public YourClass mapRow(ResultSet rs, int rowNum) throws SQLException {
        String columnXYZ = rs.getString("yourColumnName");
        //check input etc..

    }
}

【讨论】:

  • 但是,这不会跳过整个行/记录吗?如果没有值,我正在寻找的是跳过阅读特定列的值。目前,spring批处理在(例如)以下情况时抛出异常:firstname,surname,age (next row) john,martins,34 (next row) ,dorhpan, 32(注意,这里缺少名称值)在这种情况下,批处理器应该继续读取其他值并将这个空值读取为空(什么都不设置)
  • 嗯,这适用于整行。如果您想处理某些列值,您必须检查您的 RowMapper 实现,因为在那里您读出了所有单列值。
  • 重点是,我不想跳过整行。如果行号 X 在 Y 列中没有值,我只想跳过该值.. 这样 Spring 不会抛出异常,而是读取记录/行的其余部分。我没有任何 rowMapper 实现。
  • 好的,我添加了一个关于如何使用行映射器执行此操作的示例。
  • 谢谢,不过,恐怕这不是 FlatFileItemReader 中可用的方法.. 而是 JDBC 的东西..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多