grathi
grathi

Reputation: 85

Spring Batch Item Reader - use skippedLinesCallback to set input field names

I have a simple job as below:

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

itemReader is as below:

<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">
                <bean
                    class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                    <property name="delimiter" value="," />
                    <property name="names" value="${INPUT_FILE_FIELDS}" />
                </bean>
            </property>
            <property name="fieldSetMapper">
                <bean
                    class="org.springframework.batch.item.file.mapping.PassThroughFieldSetMapper" />
            </property>
        </bean>
    </property>
    <property name="resource" value="#{stepExecutionContext['inputKeyName']}" />
</bean>

I am getting input files with a single line header. I want to set the header line as ${INPUT_FILE_FIELDS} for the reader. I am trying to achieve it using skippedLinesCallback property but got stucked in the process.

Is there anyway by which I can read the header line and set it as input_fields for the reader to parse rest of the records in the file. Please suggest.

Upvotes: 4

Views: 4505

Answers (1)

Luca Basso Ricci
Luca Basso Ricci

Reputation: 18403

You can:

  1. declare your DelimitedLineTokenizer bean not anonymous (call it lineTokenizer)
  2. in skippedLinesCallback set lineTokenizer reference as property
  3. in your SkippedLineCallback: split header then set as names in lineTokenizer ref setted before

Upvotes: 7

Related Questions