【发布时间】:2018-07-02 09:41:06
【问题描述】:
当我在 Spring Batch 中读取 CSV 文件时,当特定列没有实际值时,它会在行中引发 BindException (typeMismatch)。
如何跳过它们?
【问题讨论】:
-
您可以发布您的堆栈跟踪以及示例输入文件内容吗?
标签: java spring mongodb spring-mvc spring-batch
当我在 Spring Batch 中读取 CSV 文件时,当特定列没有实际值时,它会在行中引发 BindException (typeMismatch)。
如何跳过它们?
【问题讨论】:
标签: java spring mongodb spring-mvc spring-batch
我如下配置了我的 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..
}
}
【讨论】:
firstname,surname,age (next row) john,martins,34 (next row) ,dorhpan, 32(注意,这里缺少名称值)在这种情况下,批处理器应该继续读取其他值并将这个空值读取为空(什么都不设置)
RowMapper 实现,因为在那里您读出了所有单列值。