如何将字符串(非托管 bean)传递给托管 bean
How to pass a String (Non managed bean) to a managed bean
我有一个 spring 批处理作业。有一个调用 reader 方法的步骤。
步骤
@Bean public Step myStep(FlatFileItemWriter<String> writer, Processor
processor, @Value("${com.tableName}") String myTableName) {
return stepBuilderFactory.get("step1")
.<MyBean, String> chunk(this.chuckSize)
.reader(reader(myTableName, this.myRowMapper))
.processor(processor)
.writer(writer)
.build();
}
READER 工作
@Bean
public <T> JdbcCursorItemReader<T> reader(@Value("${com.tableName}") String tableName, RowMapper<T> rowMapper) {
JdbcCursorItemReader<T> jdbcCursorItemReader = new JdbcCursorItemReader<>();
String query = "select * from " + tableName;
jdbcCursorItemReader.setDataSource(dataSource);
jdbcCursorItemReader.setSql(query);
jdbcCursorItemReader.setRowMapper(rowMapper);
return jdbcCursorItemReader;
}
我希望我的 reader 采用动态表名。所以我将 reader 更改为如下所述。
@Bean
public <T> JdbcCursorItemReader<T> reader(String tableName, RowMapper<T> rowMapper) {
JdbcCursorItemReader<T> jdbcCursorItemReader = new JdbcCursorItemReader<>();
String query = "select * from " + tableName;
jdbcCursorItemReader.setDataSource(dataSource);
jdbcCursorItemReader.setSql(query);
jdbcCursorItemReader.setRowMapper(rowMapper);
return jdbcCursorItemReader;
}
这会导致以下错误。
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of method reader in com.walgreens.oracleextractionbatch.OracleExtractionJobConfiguration required a bean of type 'java.lang.String' that could not be found.
Action:
Consider defining a bean of type 'java.lang.String' in your configuration.
经过大量谷歌搜索,我尝试了很多解决方法。但我想我缺少一些基本的东西。请帮忙。 TIA
在 Spring 批处理的上下文中使 Reader 动态化会使它们变得懒惰。
我们可以使用 @StepScope
让 reader 和 writer 变得懒惰。现在有了 StepScope 我们可以传递参数。最流行的参数传递方式是使用 JobParameters
或使用 stepExecutionContext
.
在您的情况下,如果您在工作开始时知道 table 名称,则使用 JobParameters
在步骤中访问 JobParameters
的示例代码。
@Bean
@StepScope
public <T> JdbcCursorItemReader<T> reader(@Value("#{jobParameters['tableName']}") String tableName), RowMapper<T> rowMapper) {
如果您从某些处理中获得 table 名称(在前面的某些步骤中),那么您需要在 stepExecutionContext
中设置 table 名称
这是您从 stepExecutionContext
访问 table 名称的方法
@Bean
@StepScope
public <T> JdbcCursorItemReader<T> reader(@Value("#{stepExecutionContext['tableName']}") String tableName), RowMapper<T> rowMapper) {
JdbcCursorItemReader<T> jdbcCursorItemReader = new JdbcCursorItemReader<>();
String query = "select * from " + tableName;
jdbcCursorItemReader.setDataSource(dataSource);
jdbcCursorItemReader.setSql(query);
jdbcCursorItemReader.setRowMapper(rowMapper);
return jdbcCursorItemReader;
}
希望对您有所帮助
我更改了 Reader、Writer 和 Step[=18= 的范围] bean 到 原型 。我保留了处理器 bean 的范围(单例),因为处理器逻辑对于所有场景都是相同的。
谢谢阿卡什
我有一个 spring 批处理作业。有一个调用 reader 方法的步骤。
步骤
@Bean public Step myStep(FlatFileItemWriter<String> writer, Processor
processor, @Value("${com.tableName}") String myTableName) {
return stepBuilderFactory.get("step1")
.<MyBean, String> chunk(this.chuckSize)
.reader(reader(myTableName, this.myRowMapper))
.processor(processor)
.writer(writer)
.build();
}
READER 工作
@Bean
public <T> JdbcCursorItemReader<T> reader(@Value("${com.tableName}") String tableName, RowMapper<T> rowMapper) {
JdbcCursorItemReader<T> jdbcCursorItemReader = new JdbcCursorItemReader<>();
String query = "select * from " + tableName;
jdbcCursorItemReader.setDataSource(dataSource);
jdbcCursorItemReader.setSql(query);
jdbcCursorItemReader.setRowMapper(rowMapper);
return jdbcCursorItemReader;
}
我希望我的 reader 采用动态表名。所以我将 reader 更改为如下所述。
@Bean
public <T> JdbcCursorItemReader<T> reader(String tableName, RowMapper<T> rowMapper) {
JdbcCursorItemReader<T> jdbcCursorItemReader = new JdbcCursorItemReader<>();
String query = "select * from " + tableName;
jdbcCursorItemReader.setDataSource(dataSource);
jdbcCursorItemReader.setSql(query);
jdbcCursorItemReader.setRowMapper(rowMapper);
return jdbcCursorItemReader;
}
这会导致以下错误。
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of method reader in com.walgreens.oracleextractionbatch.OracleExtractionJobConfiguration required a bean of type 'java.lang.String' that could not be found.
Action:
Consider defining a bean of type 'java.lang.String' in your configuration.
经过大量谷歌搜索,我尝试了很多解决方法。但我想我缺少一些基本的东西。请帮忙。 TIA
在 Spring 批处理的上下文中使 Reader 动态化会使它们变得懒惰。
我们可以使用 @StepScope
让 reader 和 writer 变得懒惰。现在有了 StepScope 我们可以传递参数。最流行的参数传递方式是使用 JobParameters
或使用 stepExecutionContext
.
在您的情况下,如果您在工作开始时知道 table 名称,则使用 JobParameters
在步骤中访问 JobParameters
的示例代码。
@Bean
@StepScope
public <T> JdbcCursorItemReader<T> reader(@Value("#{jobParameters['tableName']}") String tableName), RowMapper<T> rowMapper) {
如果您从某些处理中获得 table 名称(在前面的某些步骤中),那么您需要在 stepExecutionContext
这是您从 stepExecutionContext
@Bean
@StepScope
public <T> JdbcCursorItemReader<T> reader(@Value("#{stepExecutionContext['tableName']}") String tableName), RowMapper<T> rowMapper) {
JdbcCursorItemReader<T> jdbcCursorItemReader = new JdbcCursorItemReader<>();
String query = "select * from " + tableName;
jdbcCursorItemReader.setDataSource(dataSource);
jdbcCursorItemReader.setSql(query);
jdbcCursorItemReader.setRowMapper(rowMapper);
return jdbcCursorItemReader;
}
希望对您有所帮助
我更改了 Reader、Writer 和 Step[=18= 的范围] bean 到 原型 。我保留了处理器 bean 的范围(单例),因为处理器逻辑对于所有场景都是相同的。
谢谢阿卡什