spring - 扩展 JdbcCursorItemReader 时出现 SQL 查询错误
问题描述
我有以下 ItemReader 类
@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<Person> 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;
}
}
当我运行具有上述代码作为 itemReader 的代码库时,我得到
Caused by: java.lang.IllegalArgumentException: The SQL query must be provided
这是完整的堆栈跟踪:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'readingObjectItemReader' defined in file [\demo-project\bin\main\com\spring-batch\test\config\ReadingObjectItemReader.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: The SQL query must be provided
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:895) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) ~[spring-boot-2.3.1.BUILD-SNAPSHOT.jar:2.3.1.BUILD-SNAPSHOT]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) ~[spring-boot-2.3.1.BUILD-SNAPSHOT.jar:2.3.1.BUILD-SNAPSHOT]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) ~[spring-boot-2.3.1.BUILD-SNAPSHOT.jar:2.3.1.BUILD-SNAPSHOT]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.3.1.BUILD-SNAPSHOT.jar:2.3.1.BUILD-SNAPSHOT]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.3.1.BUILD-SNAPSHOT.jar:2.3.1.BUILD-SNAPSHOT]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) ~[spring-boot-2.3.1.BUILD-SNAPSHOT.jar:2.3.1.BUILD-SNAPSHOT]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.3.1.BUILD-SNAPSHOT.jar:2.3.1.BUILD-SNAPSHOT]
at gov.va.med.ccrs.pit.extract.CcrsPitextractApplication.main(CcrsPitextractApplication.java:12) ~[main/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.3.1.BUILD-SNAPSHOT.jar:2.3.1.BUILD-SNAPSHOT]
Caused by: java.lang.IllegalArgumentException: The SQL query must be provided
at org.springframework.util.Assert.notNull(Assert.java:198) ~[spring-core-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.batch.item.database.JdbcCursorItemReader.afterPropertiesSet(JdbcCursorItemReader.java:108) ~[spring-batch-infrastructure-4.2.2.RELEASE.jar:4.2.2.RELEASE]
at gov.va.med.ccrs.pit.extract.config.ReadingObjectItemReader.afterPropertiesSet(ReadingObjectItemReader.java:58) ~[main/:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
... 22 common frames omitted
有什么我应该添加的代码才能工作。提前致谢。
解决方案
我能够通过不扩展 JdbcCursorItemReader 并从我定义了我的步骤的类中传递数据源来完成这项工作。
进行更正后,类如下所示:
@Configuration
public class ReadingObjectItemReader {
@Bean
ItemReader<Person> cursorReaderForDb(DataSource dataSource) {
String sql = "select TOP(10) * from dbo.Person ";
JdbcCursorItemReader<Person> cursor = new JdbcCursorItemReader<Person>();
cursor.setDataSource(dataSource);
cursor.setSql(sql);
cursor.setRowMapper(new BeanPropertyRowMapper<>(Person.class));
cursor.setFetchSize(10);
return cursor;
}
}
我知道这是一种奇怪的行为。我仍然想通过扩展 JdbcCursorItemReader 来完成这项工作。因此,任何使其正确的建议都值得赞赏。
推荐阅读
- android - 什么是 ContiguousPagedList?
- python - 无法打开包含文件:'mysql.h'
- mysql - MySQL 数据库的间隔时间
- httpclient - JVM Out.of.Memory 异常上的连接池关闭
- ios - 带有 MVC 模式的 Legacy Objective C 代码是否与 RxSwift 共存?
- scala - 如何映射扩展共同特征的对象的 Hlist?
- java - 调用 CloseableHttpAsyncClient Close 方法时发生死锁
- three.js - 如何渲染 TextGeometry?
- haskell - 是否可以像 NPM (NodeJS) 一样设计 Stack (Haskell)?
- xquery - xquery:将 where 子句放入变量中?通过变量构建 where 子句?