0

我是 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;
        }
}

在 Step 我这样称呼它:

@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 扩展它时我的实现有什么问题吗?还有没有其他方法可以在除 PaginationReader 之外的 InputReader 上使用 JPA 查询,如 findAll() 和 JPQL?

4

1 回答 1

0

当 Spring 尝试注入时:

@Autowired
ReadingObjectItemReader readingObject;

它看到ReadingObjectItemReader实现InitializingBean并调用afterPropertiesSet. 在这种方法中,有一个检查来验证是否提供了 sql 查询,但事实并非如此,这甚至在到达reader(readingObject.cursorReader()).

创建扩展的配置类JdbcCursorItemReader是不正确的。配置类用于声明 bean 定义。您实际上不需要此类,您可以在步骤定义旁边声明阅读器 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();
}
于 2020-06-10T10:06:29.323 回答