当我在 Spring Batch 中读取 CSV 文件时,当特定列没有实际值时,它会在行中抛出 BindException (typeMismatch)。
如何跳过它们?
最佳答案
我配置了我的 ItemReader,如下所示:
Spring 配置:
@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;
}
}
进一步评论后编辑:
列值跳过所需的 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..
}
}
关于java - 如何跳过 FlatFileItemReader<T> 中为空的特定列的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51133183/