Spring batch jobParameters 值为空
Spring batch jobParameters value null
在 spring 批次中,我试图通过 jobParameters
并在我的 JdbcCursorItemReader
中使用它们。相同的片段是:
@Configuration
public class SpringBatchConfig extends DefaultBatchConfigurer{
private String demoVar;
public String getDemoVar() {
return demoVar;
}
public void setDemoVar(@Value("#{jobParameters['demoVarValue']}") String demoVar) {
this.demoVar = demoVar;
}
@Bean
@StepScope
public JdbcCursorItemReader<User> reader1() {
String sqlQuery = String.format("select * FROM TABLE_NAME where demoVar=? ");
System.out.println(demoVar);
JdbcCursorItemReader<User> cursorItemReader = new JdbcCursorItemReader<>();
cursorItemReader.setDataSource(dataSource);
cursorItemReader.setSql(sqlQuery);
cursorItemReader.setPreparedStatementSetter(new PreparedStatementSetter() {
public void setValues(PreparedStatement preparedStatement) throws SQLException {
preparedStatement.setString(1, demoVar);
}
});
cursorItemReader.setRowMapper(new DbRowMapper());
return cursorItemReader;
}
...
控制器class(包含作业启动器):
@RestController
@RequestMapping("/load")
public class LoadController {
@Autowired
JobLauncher jobLauncher;
@Autowired
Job job;
@GetMapping("/users")
public BatchStatus load() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
JobParameters jobParameters = new JobParametersBuilder()
.addString("demoVarValue", "001")
.toJobParameters();
JobExecution jobExecution = jobLauncher.run(job, jobParameters);
System.out.println("JobExecution: " + jobExecution.getStatus());
return jobExecution.getStatus();
}
}
但是在 reader
bean 中,从 jobParameters
解析的 demoVar
的值被作为 null
而不是预期的 001
传递。
您不需要 demoVar
字段(除非您在其他地方调用 getter)。您可以将它作为参数传递给 reader 的 bean 定义方法:
@Bean
@StepScope
public JdbcCursorItemReader<User> reader1(@Value("#{jobParameters['demoVarValue']}") String demoVar) {
String sqlQuery = String.format("select * FROM TABLE_NAME where demoVar=? ");
System.out.println(demoVar);
JdbcCursorItemReader<User> cursorItemReader = new JdbcCursorItemReader<>();
cursorItemReader.setDataSource(dataSource);
cursorItemReader.setSql(sqlQuery);
cursorItemReader.setPreparedStatementSetter(new PreparedStatementSetter() {
public void setValues(PreparedStatement preparedStatement) throws SQLException {
preparedStatement.setString(1, demoVar);
}
});
cursorItemReader.setRowMapper(new DbRowMapper());
return cursorItemReader;
}
作业参数的后期绑定在参考文档的 Late Binding of Job and Step Attributes 部分进行了说明。
在 spring 批次中,我试图通过 jobParameters
并在我的 JdbcCursorItemReader
中使用它们。相同的片段是:
@Configuration
public class SpringBatchConfig extends DefaultBatchConfigurer{
private String demoVar;
public String getDemoVar() {
return demoVar;
}
public void setDemoVar(@Value("#{jobParameters['demoVarValue']}") String demoVar) {
this.demoVar = demoVar;
}
@Bean
@StepScope
public JdbcCursorItemReader<User> reader1() {
String sqlQuery = String.format("select * FROM TABLE_NAME where demoVar=? ");
System.out.println(demoVar);
JdbcCursorItemReader<User> cursorItemReader = new JdbcCursorItemReader<>();
cursorItemReader.setDataSource(dataSource);
cursorItemReader.setSql(sqlQuery);
cursorItemReader.setPreparedStatementSetter(new PreparedStatementSetter() {
public void setValues(PreparedStatement preparedStatement) throws SQLException {
preparedStatement.setString(1, demoVar);
}
});
cursorItemReader.setRowMapper(new DbRowMapper());
return cursorItemReader;
}
...
控制器class(包含作业启动器):
@RestController
@RequestMapping("/load")
public class LoadController {
@Autowired
JobLauncher jobLauncher;
@Autowired
Job job;
@GetMapping("/users")
public BatchStatus load() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
JobParameters jobParameters = new JobParametersBuilder()
.addString("demoVarValue", "001")
.toJobParameters();
JobExecution jobExecution = jobLauncher.run(job, jobParameters);
System.out.println("JobExecution: " + jobExecution.getStatus());
return jobExecution.getStatus();
}
}
但是在 reader
bean 中,从 jobParameters
解析的 demoVar
的值被作为 null
而不是预期的 001
传递。
您不需要 demoVar
字段(除非您在其他地方调用 getter)。您可以将它作为参数传递给 reader 的 bean 定义方法:
@Bean
@StepScope
public JdbcCursorItemReader<User> reader1(@Value("#{jobParameters['demoVarValue']}") String demoVar) {
String sqlQuery = String.format("select * FROM TABLE_NAME where demoVar=? ");
System.out.println(demoVar);
JdbcCursorItemReader<User> cursorItemReader = new JdbcCursorItemReader<>();
cursorItemReader.setDataSource(dataSource);
cursorItemReader.setSql(sqlQuery);
cursorItemReader.setPreparedStatementSetter(new PreparedStatementSetter() {
public void setValues(PreparedStatement preparedStatement) throws SQLException {
preparedStatement.setString(1, demoVar);
}
});
cursorItemReader.setRowMapper(new DbRowMapper());
return cursorItemReader;
}
作业参数的后期绑定在参考文档的 Late Binding of Job and Step Attributes 部分进行了说明。