Java 如何跳过特定列';s值,其中FlatFileItemReader中的值为空<;T>;?
当我在Spring批处理中读取CSV文件时,当某个特定列没有实际值时,它会在行中抛出BindException(typeMismatch)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
如何跳过它们?我在下面配置了我的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的东西。。