我在Web应用程序中设置了自定义弹簧范围。 范围处理基于数据源的NamedParameterJdbcTemplate对象的创建,基于地图的存储和分发。
我对此设置有一个令人困惑的问题:它在一台计算机上运行正常,而在另一台计算机上运行正常。两者都有Tomcat 7.0.52,一个有Oracle Java,另一个有OpenJDK。一个是Mac,另一个是Linux。
applicationContext.xml中的相关设置:
<bean id="dataSourceScope" class="com.example.backoffice.controller.springconfig.DataSourceScope"/>
<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
<property name="scopes">
<map>
<entry key="dataSourceScope">
<ref bean="dataSourceScope"/>
</entry>
</map>
</property>
</bean>
<bean id="engineDataSource" class="javax.sql.DataSource" scope="dataSourceScope">
<aop:scoped-proxy/>
</bean>
<bean id="engineDatabase" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate" scope="dataSourceScope">
<constructor-arg ref="engineDataSource" />
</bean>
<bean id="configService" class="com.example.core.config.service.ConfigService" scope="dataSourceScope">
<aop:scoped-proxy/>
</bean>
DataSourceScope代码(摘自最基本的内容):
public class DataSourceScope implements Scope {
private volatile Map<String, DataSource> datasources = new HashMap<String, DataSource>();
private volatile Map<String, NamedParameterJdbcTemplate> templates = new HashMap<String, NamedParameterJdbcTemplate>();
private volatile Map<String, ConfigService> services = new HashMap<String, ConfigService>();
public void setDatasources(Map<String, DataSource> sources) {
Map<String, ConfigService> services = new HashMap<String, ConfigService>();
for (Entry<String, DataSource> entry : sources.entrySet()) {
datasources.put(entry.getKey(), entry.getValue());
NamedParameterJdbcTemplate t = new NamedParameterJdbcTemplate(entry.getValue());
templates.put(entry.getKey(),t);
services.put(entry.getKey(), new ConfigService(t));
}
this.services = services;
}
@Override
public Object get(String name, @SuppressWarnings("rawtypes") ObjectFactory objectFactory) {
if (name.indexOf("configService") > -1) {
return this.services.get(databaseName);
} else if (name.indexOf("engineDatabase") > -1) {
return this.templates.get(databaseName);
} else if (name.indexOf("engineDataSource") > -1){
return this.datasources.get(databaseName);
} else {
throw new NoSuchBeanDefinitionException("DataSourceScope is not configured to wire beans with name " + name);
}
}
问题是在我连接引擎数据库的那些地方,对象保持为空。 org.springframework在调试时没有警告或异常,直到我尝试在应该连接的类之一中使用数据库( - &gt; NPE)。
事情似乎与NamedParameterJdbcTemplate没有默认构造函数有关。尽管如此,我还是在applicationContext.xml中声明了它的必需参数。更有说服力的是,这台设备在一台计算机上运行良好。