Spring批处理 jobParameters的值为null

huangapple go评论111阅读模式
英文:

Spring batch jobParameters value null

问题

在一个Spring批处理中,我试图传递jobParameters并在我的JdbcCursorItemReader中使用它们。下面是相关的一部分代码:

  1. @Configuration
  2. public class SpringBatchConfig extends DefaultBatchConfigurer{
  3. private String demoVar;
  4. public String getDemoVar() {
  5. return demoVar;
  6. }
  7. public void setDemoVar(@Value("#{jobParameters['demoVarValue']}") String demoVar) {
  8. this.demoVar = demoVar;
  9. }
  10. @Bean
  11. @StepScope
  12. public JdbcCursorItemReader<User> reader1() {
  13. String sqlQuery = String.format("select * FROM TABLE_NAME where demoVar=? ");
  14. System.out.println(demoVar);
  15. JdbcCursorItemReader<User> cursorItemReader = new JdbcCursorItemReader<>();
  16. cursorItemReader.setDataSource(dataSource);
  17. cursorItemReader.setSql(sqlQuery);
  18. cursorItemReader.setPreparedStatementSetter(new PreparedStatementSetter() {
  19. public void setValues(PreparedStatement preparedStatement) throws SQLException {
  20. preparedStatement.setString(1, demoVar);
  21. }
  22. });
  23. cursorItemReader.setRowMapper(new DbRowMapper());
  24. return cursorItemReader;
  25. }
  26. ...

控制器类(包含作业启动器):

  1. @RestController
  2. @RequestMapping("/load")
  3. public class LoadController {
  4. @Autowired
  5. JobLauncher jobLauncher;
  6. @Autowired
  7. Job job;
  8. @GetMapping("/users")
  9. public BatchStatus load() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
  10. JobParameters jobParameters = new JobParametersBuilder()
  11. .addString("demoVarValue", "001")
  12. .toJobParameters();
  13. JobExecution jobExecution = jobLauncher.run(job, jobParameters);
  14. System.out.println("JobExecution: " + jobExecution.getStatus());
  15. return jobExecution.getStatus();
  16. }
  17. }

但是在readerbean中,从jobParameters解析出的demoVar值传递为null,而不是预期的001

英文:

In a spring batch, I'm trying to pass jobParameters and use them in my JdbcCursorItemReader. A snippet from the same is:

  1. @Configuration
  2. public class SpringBatchConfig extends DefaultBatchConfigurer{
  3. private String demoVar;
  4. public String getDemoVar() {
  5. return demoVar;
  6. }
  7. public void setDemoVar(@Value(&quot;#{jobParameters[&#39;demoVarValue&#39;]}&quot;) String demoVar) {
  8. this.demoVar = demoVar;
  9. }
  10. @Bean
  11. @StepScope
  12. public JdbcCursorItemReader&lt;User&gt; reader1() {
  13. String sqlQuery = String.format(&quot;select * FROM TABLE_NAME where demoVar=? &quot;);
  14. System.out.println(demoVar);
  15. JdbcCursorItemReader&lt;User&gt; cursorItemReader = new JdbcCursorItemReader&lt;&gt;();
  16. cursorItemReader.setDataSource(dataSource);
  17. cursorItemReader.setSql(sqlQuery);
  18. cursorItemReader.setPreparedStatementSetter(new PreparedStatementSetter() {
  19. public void setValues(PreparedStatement preparedStatement) throws SQLException {
  20. preparedStatement.setString(1, demoVar);
  21. }
  22. });
  23. cursorItemReader.setRowMapper(new DbRowMapper());
  24. return cursorItemReader;
  25. }
  26. ...

Controller class(containing job launcher):

  1. @RestController
  2. @RequestMapping(&quot;/load&quot;)
  3. public class LoadController {
  4. @Autowired
  5. JobLauncher jobLauncher;
  6. @Autowired
  7. Job job;
  8. @GetMapping(&quot;/users&quot;)
  9. public BatchStatus load() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
  10. JobParameters jobParameters = new JobParametersBuilder()
  11. .addString(&quot;demoVarValue&quot;, &quot;001&quot;)
  12. .toJobParameters();
  13. JobExecution jobExecution = jobLauncher.run(job, jobParameters);
  14. System.out.println(&quot;JobExecution: &quot; + jobExecution.getStatus());
  15. return jobExecution.getStatus();
  16. }
  17. }

But in the reader bean, the value of the demoVar parsed from jobParameters is being passed as null instead of the expected 001.

答案1

得分: 3

  1. 除非在其他地方调用了getter方法,否则您不需要`demoVar`字段。您可以将其作为readerbean定义方法的参数传递:
  2. @Bean
  3. @StepScope
  4. public JdbcCursorItemReader<User> reader1(@Value("#{jobParameters['demoVarValue']}") String demoVar) {
  5. String sqlQuery = String.format("select * FROM TABLE_NAME where demoVar=? ");
  6. System.out.println(demoVar);
  7. JdbcCursorItemReader<User> cursorItemReader = new JdbcCursorItemReader<>();
  8. cursorItemReader.setDataSource(dataSource);
  9. cursorItemReader.setSql(sqlQuery);
  10. cursorItemReader.setPreparedStatementSetter(new PreparedStatementSetter() {
  11. public void setValues(PreparedStatement preparedStatement) throws SQLException {
  12. preparedStatement.setString(1, demoVar);
  13. }
  14. });
  15. cursorItemReader.setRowMapper(new DbRowMapper());
  16. return cursorItemReader;
  17. }
  18. 作业参数的延迟绑定在参考文档的[作业和步骤属性的延迟绑定](https://docs.spring.io/spring-batch/docs/4.2.x/reference/html/step.html#late-binding)部分进行了解释。
英文:

You don't need the demoVar field (unless you are calling the getter somewhere else). You can pass it as a parameter of reader's bean definition method:

  1. @Bean
  2. @StepScope
  3. public JdbcCursorItemReader&lt;User&gt; reader1(@Value(&quot;#{jobParameters[&#39;demoVarValue&#39;]}&quot;) String demoVar) {
  4. String sqlQuery = String.format(&quot;select * FROM TABLE_NAME where demoVar=? &quot;);
  5. System.out.println(demoVar);
  6. JdbcCursorItemReader&lt;User&gt; cursorItemReader = new JdbcCursorItemReader&lt;&gt;();
  7. cursorItemReader.setDataSource(dataSource);
  8. cursorItemReader.setSql(sqlQuery);
  9. cursorItemReader.setPreparedStatementSetter(new PreparedStatementSetter() {
  10. public void setValues(PreparedStatement preparedStatement) throws SQLException {
  11. preparedStatement.setString(1, demoVar);
  12. }
  13. });
  14. cursorItemReader.setRowMapper(new DbRowMapper());
  15. return cursorItemReader;
  16. }

Late binding of job parameters is explained in the Late Binding of Job and Step Attributes section of the reference documentation.

huangapple
  • 本文由 发表于 2020年10月5日 19:35:25
  • 转载请务必保留本文链接:https://go.coder-hub.com/64207827.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定