得到这样的错误-“在BeanExpressionContext类型的对象上找不到jobParameters”

时间:2019-09-22 18:46:10

标签: spring spring-boot spring-batch

我们正在创建一个Spring Batch应用程序,该应用程序从数据库中读取数据并写入另一个数据库中。在此过程中,我们需要将参数动态设置为SQL,因为我们有需要相应数据的参数。

为此,我们用@StepScope创建了一个JdbcCursorItemReader Reader,正如我在其他文章和教程中所发现的那样。但是没有成功。 Job中的块读取器实际上使用了Peekable阅读器,该内部使用JdbcCursorItemReader对象执行实际的读取操作。

当作业被触发时,我们得到错误-“在BeanExpressionContext类型的对象上找不到jobParameters”

请让我知道我在下面的bean配置中做错了什么。

@Bean
@StepScope
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
public JdbcCursorItemReader<DTO> jdbcDataReader(@Value() String param) throws Exception {

JdbcCursorItemReader<DTO> databaseReader = new JdbcCursorItemReader<DTO>();

return databaseReader;
}

// This class extends PeekableReader, and sets JdbcReader (jdbcDataReader) as delegate
@Bean
public DataPeekReader getPeekReader() {
DataPeekReader peekReader = new DataPeekReader();
return peekReader;
}

// This is the reader that uses Peekable Item Reader (getPeekReader) and also specifies chunk completion policy.
@Bean
public DataReader getDataReader() {
DataReader dataReader = new DataReader();
return dataReader;
}


// This is the step builder.
@Bean
public Step readDataStep() throws Exception {
return stepBuilderFactory.get("readDataStep")
.<DTO, DTO>chunk(getDataReader())
.reader(getDataReader())
.writer(getWriter())
.build();
}

@Bean
public Job readReconDataJob() throws Exception {
return jobBuilderFactory.get("readDataJob")
.incrementer(new RunIdIncrementer())
.flow(readDataStep())
.end()
.build();
}

1 个答案:

答案 0 :(得分:0)

  

请让我知道我在下面的bean配置中做错了什么。

您的jdbcDataReader(@Value() String param)不正确。您需要在@Value中指定Spel表达式,以指定要注入的参数。这是一个如何将作业参数传递给JdbcCursorItemReader的示例:

@Bean
@StepScope
public JdbcCursorItemReader<DTO> jdbcCursorItemReader(@Value("#{jobParameters['table']}") String table) {
    return new JdbcCursorItemReaderBuilder<DTO>()
            .sql("select * from " + table)
            // set other properties
            .build();
}

您可以在参考文档的late binding部分中找到更多详细信息。