I am using spring MVC. From my controller, I am calling jobLauncher
and in jobLauncher
I am passing job parameters like below and I\'m using annota
1) Put a scope annotation on your data processor i.e.
@Scope(value = "step")
2) Make a class instance in your data processor and inject the job parameter value by using value annotation :
@Value("#{jobParameters['fileName']}")
private String fileName;
Your final Data processor class will look like:
@Scope(value = "step")
public class DataItemProcessor implements ItemProcessor<InputData, OutPutData> {
@Value("#{jobParameters['fileName']}")
private String fileName;
public OutPutData process(final InputData inputData) throws Exception {
// i want to get job Parameters here ????
System.out.println("Job parameter:"+fileName);
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
In case your data processor is not initialized as a bean, put a @Component annotation on it:
@Component("dataItemProcessor")
@Scope(value = "step")
public class DataItemProcessor implements ItemProcessor<InputData, OutPutData> {
A better solution (in my opinion) that avoids using Spring's hacky expression language (SpEL) is to autowire the StepExecution
context into your processor using @BeforeStep
.
In your processor, add something like:
@BeforeStep
public void beforeStep(final StepExecution stepExecution) {
JobParameters jobParameters = stepExecution.getJobParameters();
// Do stuff with job parameters, e.g. set class-scoped variables, etc.
}
The @BeforeStep
annotation
Marks a method to be called before a
Step
is executed, which comes after aStepExecution
is created and persisted, but before the first item is read.