在扩展JdbcCursorItemReader时出现异常。

问题描述 投票:0回答:1

我是一个新的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

如果我把上面的逻辑写在定义了job builder和步骤的同一个类中,而不像下面的代码那样扩展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时,我的实现有什么问题,而且除了PaginationReaders之外,我还有没有其他方法可以在InputReader上使用findAll()和JPQL等JPA查询?

spring spring-boot spring-batch batch-processing spring-framework-beans
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();
}
© www.soinside.com 2019 - 2024. All rights reserved.