ureport中EnvironmentTools多数据源问题

问题描述:在多项目集成环境中,如果存在多数据源,多个EnvironmentProvider的实现类,会出现数据源替换不全的情况。
源代码如下:
ureport-core-1.1.6jar:com.bstek.ureport.env.EnvironmentTools.java

public class EnvironmentTools
implements ApplicationContextAware
{
private static Map<String, DataSource> datasourceMap;
private static String temporaryDirectory;

public static Map<String, DataSource> getDatasourceMap()
{
return datasourceMap;
}
public static String getTemporaryDirectory() {
if (temporaryDirectory == null) {
temporaryDirectory = System.getProperty("java.io.tmpdir");
}
String dir = temporaryDirectory + "/ureport";
if ((temporaryDirectory.endsWith("/")) || (temporaryDirectory.endsWith("\\"))) {
dir = temporaryDirectory + "ureport";
}
File dirFile = new File(dir);
if (!dirFile.exists()) {
dirFile.mkdirs();
}
return dir;
}
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Collection environmentProviders = applicationContext.getBeansOfType(EnvironmentProvider.class).values();
if (environmentProviders.size() > 0) {
[b] //这里只处理EnvironmentProvider的第一个实现类,如果有多个就有问题
//正确的是:应该取所有实现类的数据源的集合
EnvironmentProvider provider = (EnvironmentProvider)environmentProviders.iterator().next();[/b]

[b]datasourceMap = provider.getDatasourceMap();[/b]
[b]      //Ureport生成的临时目录也会存在类似问题
temporaryDirectory = provider.getTemporaryDirectory();[/b]
}
}
}
 
 
 
已邀请:

Jacky - 规则

赞同来自:

EnvironmentProvider实现类只应该有一个,有多个就处理不了。
多个数据源,同样放在这个EnvironmentProvider的Map里就好,不需要实现多个EnvironmentProvider。
 

hans

赞同来自:

这个在多项目集成环境中就不太方便了,真实的项目环境是:我有ABCD等10多个业务组件(工程),或者说是子系统,在运行的时候打成jar放到web/lib下,这10个业务组件可以放在一个tomcat中,也可以根据需要拆分组合形成若干个独立的系统,此时再要求我在整个容器中只有一个EnvironmentProvider实现类,不太现实。在项目开发过程中,我们也并不能强制要求各业务组件的开发者都去更改唯一的EnvironmentProvider实现类;而且也会存在多数据源的情况,甚至一个业务组件也会存在多数据源的可能。
所以:还是希望能修复此类,将当前容器中所有的实现类都迭代出来,并且合并所有的数据源。
 

Jacky - 规则

赞同来自:

好,我改一下,一会更新下最新的snapshot就行。

hans

赞同来自:

谢谢jack。
确实是因为北京农商行的项目环境比较特殊,客户要求多。

要回复问题请先登录注册