@Autowired与自定义范围的依赖关系保持为null

时间:2014-05-24 14:02:31

标签: java spring dependency-injection tomcat7

我在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中声明了它的必需参数。更有说服力的是,这台设备在一台计算机上运行良好。

0 个答案:

没有答案