Как передать строку (неуправляемый компонент) в управляемый компонент - PullRequest
0 голосов
/ 24 декабря 2018

У меня весенняя пакетная работа.Существует шаг, который вызывает метод чтения.

STEP

@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;
}

Я хочу, чтобы мой читатель использовал динамические имена таблиц.Таким образом, я изменил читателя, как указано ниже.

@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.

Я пробовал так много обходных путей после интенсивного поиска в Google.Но я думаю, что мне не хватает чего-то простогоПожалуйста помоги.ТИА

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Я изменил область действия Reader , Writer и Step bean на prototype .Я оставил область действия компонента EJB как есть (Singleton), потому что логика процессора одинакова для всех сценариев.

Спасибо, Акаш

0 голосов
/ 24 декабря 2018

Создание Reader динамическим в контексте Spring делает их ленивыми.

Мы можем сделать читателя и писателя ленивым, используя @StepScope.С помощью StepScope теперь мы можем передавать параметры.Наиболее популярный способ передачи параметров - использование JobParameters или stepExecutionContext.

. В вашем случае, если вы знаете имя таблицы в начале задания, используйте JobParameters

SampleКод для доступа к JobParameters на шаге.

 @Bean
        @StepScope
        public <T> JdbcCursorItemReader<T> reader(@Value("#{jobParameters['tableName']}") String tableName), RowMapper<T> rowMapper) {

Если вы получаете имя таблицы из некоторой обработки (на каком-то предыдущем шаге), тогда вам нужно установить имя таблицы в 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;
    }   

Надеюсь, это поможет

...