Java 如何跳过特定列';s值,其中FlatFileItemReader中的值为空<;T>;?

Java 如何跳过特定列';s值,其中FlatFileItemReader中的值为空<;T>;?,java,spring,mongodb,spring-mvc,spring-batch,Java,Spring,Mongodb,Spring Mvc,Spring Batch,当我在Spring批处理中读取CSV文件时,当某个特定列没有实际值时,它会在行中抛出BindException(typeMismatch) 如何跳过它们?我在下面配置了我的ItemReader: 弹簧配置: @Bean Step step1() { return stepBuilderFactory.get("step1") .listener(dataProcessor) .chunk(100) .faultTol

当我在Spring批处理中读取CSV文件时,当某个特定列没有实际值时,它会在行中抛出BindException(typeMismatch)


如何跳过它们?

我在下面配置了我的ItemReader:

弹簧配置:

@Bean
Step step1() {
    return stepBuilderFactory.get("step1")
            .listener(dataProcessor)
            .chunk(100)
            .faultTolerant()
            .reader(yourReader()).faultTolerant().skipPolicy(new ItemVerificationSkipper())
            .processor(dataProcessor)
            .writer(writer())
            .build();
}
itemReader.setRowMapper(new CustomRowMapper());
重要的一点是增加一项政策:

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;
    }

}
public class CustomRowMapper implements RowMapper<YourClass> {

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

    }
}
进一步评论后编辑:

跳过列值需要行映射器实现:

配置:

@Bean
Step step1() {
    return stepBuilderFactory.get("step1")
            .listener(dataProcessor)
            .chunk(100)
            .faultTolerant()
            .reader(yourReader()).faultTolerant().skipPolicy(new ItemVerificationSkipper())
            .processor(dataProcessor)
            .writer(writer())
            .build();
}
itemReader.setRowMapper(new CustomRowMapper());
CustomRowMapper.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;
    }

}
public class CustomRowMapper implements RowMapper<YourClass> {

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

    }
}
公共类CustomRowMapper实现了RowMapper{
@凌驾
public YourClass mapRow(ResultSet rs,int rowNum)抛出SQLException{
String columnXYZ=rs.getString(“yourColumnName”);
//检查输入等。。
}
}

您可以发布stacktrace和示例输入文件内容。但是,这不会跳过整行/记录吗?我想要的是,如果没有值,就跳过读取特定列的值。目前,spring batch在以下情况下引发异常(例如):
名字、姓氏、年龄(下一行)john、martins、34(下一行)、dorhpan、32
(注意,此处缺少名称值)。在这种情况下,批处理程序只需继续读取其他值,并将此空值读取为空(不设置任何内容),这对整排人都有效。如果你想处理某些列值,你必须检查你的
行映射器
实现,因为在那里你读出了所有的单列值。如果行号X在列Y中没有值,我只想跳过该值。。所以Spring不会抛出异常,而是读取记录/行的其余部分。我没有任何行映射器实现。好的,我添加了一个关于如何使用行映射器实现的示例。谢谢,但是,恐怕这不是FlatFileItemReader中可用的方法。。这相当于JDBC的东西。。