The follow config was tested and succeeded on Spring Batch 2.0.4.
<bean id="flatFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
<property name="resource" value="file:#{jobParameters['input.file.name']}" />
<property name="lineMapper" ref="lineMapper"/>
</bean>
Java code:
try {
//launcher.run(job, new JobParameters());
JobParametersBuilder jpBuilder = new JobParametersBuilder().addString("input.file.name", "files/input/test.txt");
jpBuilder.addString("output.file.name", "files/output/"+System.currentTimeMillis()+"_test.txt");
launcher.run(job, jpBuilder.toJobParameters());
} catch (Exception e) {
e.printStackTrace();
}
Another config used FileSystemResource for resource likes the follow.
<property name="resource">
<bean class="org.springframework.core.io.FileSystemResource" scope="step" autowire-candidate="false">
<constructor-arg value="#{jobParameters['input.file.name']}" />
</bean>
</property>
For ItemWriter, the configuration almost same.
NOTE:
The 'file:' is mandatory if the resource is a file needed to be load from specified path.
The scope="step" is very important. It seems the file cannot be found if it is missed.
From the reference, I found 'Any bean that uses late-binding must be declared with scope="step".'.
The follow code is is used by SpringBatch 1.x.
Just like the reference metioned, you need to define a listener for step to the proxy to have the access to the StepExecution.
<property name="listeners">
<list>
<ref bean="inputFile" />
</list>
</property>
<bean id="inputFile" class="org.springframework.batch.core.resource.StepExecutionResourceProxy">
<property name="filePattern" value="file://%file.name%"/>
</bean>
<bean id="myFileItemReader" class="org.springframework.batch.item.file.FlatFil eItemReader">
<property name="resource" ref="inputFile" />
</bean>
Java Code:
JobParametersBuilder builder = new JobParametersBuilder();
builder.addString("file.name", "files/input/test.txt");
JobExecution jobExecution = getJobLauncher().run(getJob(), builder.toJobParameters());