扩展 JdbcCursorItemReader 的异常
Exception on extending JdbcCursorItemReader
我是 Spring 批处理的新手,正在尝试获取这方面的一些知识。
我已经编写了以下方法来从 table 读取数据,但我收到一个异常告诉 "The SQL query must be provided" 尽管我在方法中提供了查询。
@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
如果我在相同的 class 中编写上述逻辑,其中定义了我的作业构建器和步骤,并且没有像我下面的代码那样扩展 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;
}
有人可以建议我在新 class 中定义它并使用 JdbcCursorItemReader 扩展它时我的实现有什么问题吗?还有其他任何方法可以使用 JPA 查询,如 findAll() 和InputReader 上的 JPQL 而不是 PaginationReaders?
当 Spring 尝试注入时:
@Autowired
ReadingObjectItemReader readingObject;
它看到 ReadingObjectItemReader
实现了 InitializingBean
并调用了 afterPropertiesSet
。在此方法中,有一个检查以验证是否提供了 sql 查询,但事实并非如此,这种情况甚至发生在到达 reader(readingObject.cursorReader())
.
之前
创建扩展 JdbcCursorItemReader
的配置 class 是不正确的。配置 class 用于声明 bean 定义。你实际上不需要这个class,你可以在你的步骤定义旁边声明reader 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();
}
我是 Spring 批处理的新手,正在尝试获取这方面的一些知识。 我已经编写了以下方法来从 table 读取数据,但我收到一个异常告诉 "The SQL query must be provided" 尽管我在方法中提供了查询。
@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
如果我在相同的 class 中编写上述逻辑,其中定义了我的作业构建器和步骤,并且没有像我下面的代码那样扩展 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;
}
有人可以建议我在新 class 中定义它并使用 JdbcCursorItemReader 扩展它时我的实现有什么问题吗?还有其他任何方法可以使用 JPA 查询,如 findAll() 和InputReader 上的 JPQL 而不是 PaginationReaders?
当 Spring 尝试注入时:
@Autowired
ReadingObjectItemReader readingObject;
它看到 ReadingObjectItemReader
实现了 InitializingBean
并调用了 afterPropertiesSet
。在此方法中,有一个检查以验证是否提供了 sql 查询,但事实并非如此,这种情况甚至发生在到达 reader(readingObject.cursorReader())
.
创建扩展 JdbcCursorItemReader
的配置 class 是不正确的。配置 class 用于声明 bean 定义。你实际上不需要这个class,你可以在你的步骤定义旁边声明reader 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();
}