其他分享
首页 > 其他分享> > Spring Batch-验证输入的csv文件中的标题行,如果文件无效则跳过该文件

Spring Batch-验证输入的csv文件中的标题行,如果文件无效则跳过该文件

作者:互联网

我有一个简单的工作,如下所示:

<batch:step id="step">
 <batch:tasklet>
  <batch:chunk reader="itemReader" processor="itemProcessor" writer="itemWriter" commit-    interval="5000" />
 </batch:tasklet>
</batch:step>

itemReader如下:

<bean id="itemReader" class="org.springframework.batch.item.file.FlatFileItemReader"
scope="step">
 <property name="linesToSkip" value="1"></property>
 <property name="skippedLinesCallback" ref="skippedLinesCallback" ></property>

 <property name="lineMapper">
    <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
                <property name="lineTokenizer" ref="lineTokenizer">                
                <property name="delimiter" value="," />                    
            </bean>
        </property>
        <property name="fieldSetMapper">
            <bean
                class="org.springframework.batch.item.file.mapping.PassThroughFieldSetMapper" />
        </property>
    </bean>
</property>
<property name="resource" value="#{stepExecutionContext['inputKeyName']}" />
</bean>

<bean id"lineTokenizer"                        class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">

<bean id="skippedLinesCallback" class="com.test.IteMReaderHeader" >
<property name="lineTokenizer" ref="lineTokenizer">
</bean>

我通过在其中插入“ lineTokenizer”来设置“ com.test.IteMReaderHeader”类中输入字段的“名称”.

我需要使用固定的标题值来验证输入的csv文件中第一行的标题行,如果标题行无效,那么在这种情况下,我需要使步骤失败并跳过整个文件,以便可以将下一个文件用于阅读.

请提出实现此目标的合适方法.
非常感谢您的宝贵时间和宝贵的意见.

谢谢 !!

解决方法:

FlatFileItemReader文件停止条件的查找代码被管理;

>具有私有字段boolean noInput
>具有在受保护的doRead()中使用的私有函数readLine()

恕我直言,最好的解决方案是从您skippedLineCallback抛出运行时异常,并将错误作为读取器耗尽的条件进行管理.

敌人示例以这种方式编写您的代表

class SkippableItemReader<T> implements ItemStreamReader<T> {
  private ItemStreamReader<T> flatFileItemReader;
  private boolean headerError = false;

  void open(ExecutionContext executionContext) throws ItemStreamException {
    try {
      flatFileItemReader.open(executionContext);
    } catch(MyCustomExceptionHeaderErrorException e) {
      headerError = true;
    }
  }

  public T read() {
    if(headerError)
      return null;
    return flatFileItemReader.read();
  }

  // Other functions delegation
}

(当然,您必须手动将代表注册为流)
或将FlatFileItemReader扩展为

class SkippableItemReader<T> extends FlatFileItemReader<T> {
  private boolean headerError = false;

  protected void doOpen() throws Exception {
    try {
      super.doOpen();
    } catch(MyCustomExceptionHeaderErrorException e) {
      headerError = true;
    }
  }

  protected T doRead() throws Exception {
    if(headerError)
      return null;
    return super.doRead();
  }    
}

该代码未经测试直接编写,因此可能会出现错误,但是希望您能理解我的观点.
希望可以解决您的问题

标签:skip,file,spring-batch,spring
来源: https://codeday.me/bug/20191030/1968230.html