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 部分进行了说明。