Исключение при расширении JdbcCursorItemReader

Я новичок в Spring Batch и пытаюсь получить некоторые знания об этом. Я написал следующий метод для чтения данных из таблицы, но получаю исключение, говорящее: «Должен быть предоставлен SQL-запрос», хотя я предоставил запрос в методе.

    @Configuration
    public class ReadingObjectItemReader extends JdbcCursorItemReader<Person> {

        public DataSource getDataSource() { return dataSource; }        
        @Resource
        public void setDataSource(DataSource dataSource) { super.setDataSource(dataSource); }

        @Autowired
        DataSource dataSource;

        @Bean
        public JdbcCursorItemReader<DimInstitutionalClaim> cursorReader() {
            JdbcCursorItemReader<Person> databaseReader = new JdbcCursorItemReader<>();
            databaseReader.setDataSource(dataSource);
            databaseReader.setSql("select TOP(10) * from dbo.Person ");
            databaseReader.setFetchSize(5);
            databaseReader.setRowMapper(new BeanPropertyRowMapper<>(Person.class));
            return databaseReader;
        }
}

и на шаге я называю это так:

@Autowired
ReadingObjectItemReader readingObject;

@Bean
public Step step1() {
    return stepBuilderFactory.get("step1").<Person,Person>chunk(2).reader(readingObject.cursorReader())
            .writer(itemWriter()).listener(promotionListener()).build();
}

при запуске приведенного выше кода на моем шаге InputReader я получаю

Caused by: java.lang.IllegalArgumentException: The SQL query must be provided

Если я пишу приведенную выше логику в том же классе, где определены мои конструкторы заданий и шаги, и без расширения JdbcCursorItemReader, как мой код ниже, он работает нормально.

@Bean
public Step step1() {
    return stepBuilderFactory.get("step1").<Person, Person>chunk(2).reader(itemReader())
            .writer(itemWriter()).listener(promotionListener()).build();
}

@Bean
public ItemReader<Person> itemReader() {
    JdbcCursorItemReader<Person> databaseReader = new JdbcCursorItemReader<>();
    databaseReader.setDataSource(dataSource);
    databaseReader.setSql("select TOP(10) * from dbo.Person ");
    databaseReader.setFetchSize(5);
    databaseReader.setRowMapper(new BeanPropertyRowMapper<>(Person.class));
    return databaseReader;
}

Может ли кто-нибудь предложить мне, что не так с моей реализацией при ее определении в новом классе и расширении с помощью JdbcCursorItemReader, а также есть ли какой-либо другой способ, которым я могу использовать запросы JPA, такие как findAll() и JPQL на InputReader, кроме PaginationReaders?


person Vamsi    schedule 05.06.2020    source источник
comment
Итак, для случая расширения JdbcCursorItemReader, как настроить его на шаг?   -  person Ken Chan    schedule 06.06.2020
comment
Я добавил часть, отредактировав сообщение о том, как я вызываю метод JdbcCursorItemReader на шаге   -  person Vamsi    schedule 06.06.2020


Ответы (1)


Когда Spring пытается внедрить это:

@Autowired
ReadingObjectItemReader readingObject;

Он видит, что ReadingObjectItemReader реализует InitializingBean и вызывает afterPropertiesSet. В этом методе есть проверка, которая подтверждает наличие SQL-запроса, но это не так, и это происходит еще до того, как вы достигнете reader(readingObject.cursorReader()).

Создание класса конфигурации, расширяющего JdbcCursorItemReader, неверно. Класс конфигурации используется для объявления определений компонентов. На самом деле вам не нужен этот класс, вы можете объявить bean-компонент для чтения рядом с вашим определением шага и внедрить его в шаг:

@Bean
public JdbcCursorItemReader<DimInstitutionalClaim> cursorReader() {
        JdbcCursorItemReader<Person> databaseReader = new JdbcCursorItemReader<>();
        databaseReader.setDataSource(dataSource);
        databaseReader.setSql("select TOP(10) * from dbo.Person ");
        databaseReader.setFetchSize(5);
        databaseReader.setRowMapper(new BeanPropertyRowMapper<>(Person.class));
        return databaseReader;
}

@Bean
public Step step1() {
   return stepBuilderFactory.get("step1").<Person, Person>chunk(2)
        .reader(cursorReader())
        .writer(itemWriter())
        .listener(promotionListener())
        .build();
}
person Mahmoud Ben Hassine    schedule 10.06.2020