spring - 如何自定义 Spring Batch DelimitedLineTokenizer

标签 spring spring-batch

我有两种文件类型要插入数据库中。

格式为:aa;bb;cc 和 aa;bb;cc;dd;ee

这是我的 FlatFileItemReader :

    <bean name="readerContractToAddIntoPRV" class="org.springframework.batch.item.file.FlatFileItemReader">
        <property name="comments" value="#" />
        <property name="linesToSkip" value="1" />
        <property name="strict" value="false" />
        <property name="lineMapper">
            <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
                <property name="fieldSetMapper">
                    <bean class="net.wl.batchs.fieldSetMapper.LineToCreateIntoPrvFieldSetMapper" />
                </property>
                <property name="lineTokenizer">
                    <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                        <property name="delimiter" value=";"/>
                        <property name="names" value="aa,bb,cc,dd,ee" />
                    </bean>
                </property>
            </bean>
        </property>
    </bean>

我想要一个适用于这两种类型文件的设置。

目前,我有这个:

org.springframework.batch.item.file.transform.IncorrectTokenCountException: Incorrect number of tokens found in record: expected 3 actual 5

你有什么想法吗?

谢谢。

编辑:更正后:

<bean name="readerContractToAddIntoPRV" class="org.springframework.batch.item.file.FlatFileItemReader">
    <property name="comments" value="#" />
    <property name="linesToSkip" value="1" /> 
    <property name="strict" value="false" />
    <property name="lineMapper">
        <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper" p:lineTokenizer-ref="multilineFileTokenizer">
            <property name="fieldSetMapper">
                <bean class="net.wl.batchs.fieldSetMapper.LineToCreateIntoPrvFieldSetMapper" />
            </property>
        </bean>
    </property>
</bean>

<bean id="multilineFileTokenizer" class="org.springframework.batch.item.file.transform.PatternMatchingCompositeLineTokenizer">
  <property name="tokenizers">
    <map>
      <entry key="*;*;*;*;*" value-ref="NSCE_ICCID_MSISDN_LOGIN_PWD"/>
      <entry key="*;*;*" value-ref="NSCE_ICCID_MSISDN"/>
      <entry key="*" value-ref="headerDefault"/>
    </map>
  </property>
</bean>

<bean id="parentLineTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer" abstract="true">
    <property name="delimiter" value=";"/>
</bean>
<bean id="NSCE_ICCID_MSISDN_LOGIN_PWD" parent="parentLineTokenizer">
    <property name="names" value="nsce,iccid,msisdn,login,pwd" />
</bean>
<bean id="NSCE_ICCID_MSISDN" parent="parentLineTokenizer">
    <property name="names" value="nsce,iccid,msisdn" />
</bean>
<bean id="headerDefault" parent="parentLineTokenizer">
    <property name="names" value="nsce,iccid,msisdn" />
</bean>

最佳答案

问题不在于你的分词器。您需要做的是使用 PatternMatchingCompositeLineMapper ( http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/file/mapping/PatternMatchingCompositeLineMapper.html )。这将允许您为每种线类型创建一个模式,并将其与适当的 LineTokenizer 相关联。

您可以在我们的示例中看到此 LineMapper 的运行情况:https://github.com/spring-projects/spring-batch/blob/master/spring-batch-samples/src/main/resources/jobs/multilineOrderInputTokenizers.xml

关于spring - 如何自定义 Spring Batch DelimitedLineTokenizer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27504722/

相关文章:

java - 无法将 SB 配置为使用 MySQL 托管的 BATCH_* 表

java - 防止 Spring 容器对提供的 Bean 执行注入(inject)

java - 如何使用 JpaItemWriter 更新现有实体?

java - ClassCastException $Proxy 无法转换为使用 aop

java - 有没有什么方法可以从 Spring MVC 的前端提取日志?

Spring-boot 和 Spring-Kafka 兼容性矩阵

model-view-controller - Spring 3 的 MVC 框架生产质量中的 REST 支持了吗?

java - JHipster UserService - 变量可能尚未初始化

spring-batch - Spring Batch 事务管理如何工作?

java - 如何在 Spring 批处理的作业上下文 xml 文件中使用 jobExecutionContext ['key' ]