问题
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.
回答1:
You can:
- declare your DelimitedLineTokenizer bean not anonymous (call it lineTokenizer)
- in skippedLinesCallback set lineTokenizer reference as property
- in your SkippedLineCallback: split header then set as names in lineTokenizer ref setted before
来源:https://stackoverflow.com/questions/18125501/spring-batch-item-reader-use-skippedlinescallback-to-set-input-field-names