我需要构建一个从数据库生成报告的小型报告应用程序。目前,每天和每周只有2个报告。好的人们这就是我想要做的事情,以便将来可以轻松扩展。
1)扫描报告目录中的 .properties文件,其内容如下: report.name =每周管理报告 report.datasource = myDataSource report.bootstrap.sql = SELECT getdate() report.cron.expression = 0/2 * * * MON-FRI report.service.activator.class = reporting.qvalent.JDBCReportExtractor report.recipient.email=konstantin@localhost
2)对于每个文件,创建一个弹簧集成路由,它将执行以下操作: a)根据cron表达式使用引导查询轮询数据库 b)调用激活器类,它实际上将从数据源收集所有必需的数据,并可能丰富Thymeleaf上下文 c)将百万美元上下文与模板合并并通过电子邮件发送
我现在做的是:
public class ReportDefinitionLoader implements BeanDefinitionRegistryPostProcessor {
private ConfigurableListableBeanFactory beanFactory;
private void prepareBeansForReport(Resource resource) throws IOException {
try {
Properties props = PropertiesLoaderUtils.loadProperties(resource);
String reportName = props.getProperty(REPORT_NAME_PROPERTY);
String reportDatasource = props.getProperty(REPORT_DATASOURCE_PROPERTY);
String reportCronExpression = props.getProperty(REPORT_CRON_EXPRESSION_PROPERTY);
String reportBootstrapQuery = props.getProperty(REPORT_BOOTSTRAP_QUERY_PROPERTY);
CronTrigger cronTrigger = new CronTrigger(reportCronExpression);
beanFactory.registerSingleton(reportName + CRON_TRIGGER_BEAN_NAME, cronTrigger);
DataSource dataSource = (DataSource) beanFactory.getBean(reportDatasource);
beanFactory.getBean()
beanFactory.autowireBean(dataSource);
QueueChannel channel1 = new QueueChannel();
JdbcPollingChannelAdapter jdbcPollingChannelAdapter = new JdbcPollingChannelAdapter(dataSource, reportBootstrapQuery);
SourcePollingChannelAdapter adapter = new SourcePollingChannelAdapter();
TimerManagerTaskScheduler taskScheduler = new TimerManagerTaskScheduler();
taskScheduler.schedule(new Runnable() {
@Override
public void run() {
}
}, cronTrigger);
adapter.setOutputChannel(channel1);
adapter.setSource(jdbcPollingChannelAdapter);
adapter.setBeanFactory(beanFactory);
adapter.setTaskScheduler(taskScheduler);
adapter.start();
} catch (IOException e) {
LOG.error("Could not load properties from resource: " + resource.getFile().getName(), e);
}
}
}
但是dataSource bean具有XML
中定义的未解析属性 <bean id="myDataSource" class = "com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.user}" />
<property name="password" value="${jdbc.password}" />
你能否告诉我如何从Spring上下文中获取bean,以便在另一个也可以放在spring上下文中的类中进一步使用它?目前,我在启动时会得到这些:
2014-09-04 11:15:12,545 [WARN] - Could not load driverClass ${jdbc.driver}
java.lang.ClassNotFoundException: ${jdbc.driver}
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:190)
at com.mchange.v2.c3p0.DriverManagerDataSource.ensureDriverLoaded(DriverManagerDataSource.java:100)
at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:132)
当我使用XML配置时,数据源属性已解析好,所以这个问题不是因为配置错误的PropertyPlaceholderConfigurer。
答案 0 :(得分:0)
我实现了错误的接口 - InitializingBean似乎是正确的。 现在我在afterPropertiesSet()回调中创建bean定义。橡皮鸭调试确实有效!谢谢大家。