首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unitils:如何从Spring获取数据库属性

Unitils:如何从Spring获取数据库属性
EN

Stack Overflow用户
提问于 2012-02-22 02:31:36
回答 2查看 1.4K关注 0票数 1

我正在使用Unitils和Spring进行单元测试。我已经使用属性文件为Spring配置了数据源。

我的问题是,如何为Unitils使用相同的数据源或相同的属性?

Unitils期望类路径unitils.properties中有一个文件,其中包含url、用户、密码和驱动程序等数据库配置参数。

我尝试使用Spring配置中使用的属性来配置Unitils,如下所示,但它不起作用。

代码语言:javascript
复制
database.driverClassName=${jdbc.driver.class}

谢谢,阿迪

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-23 02:46:00

Ryan的回答是正确的,也是有帮助的,尽管我使用了不同的方法。

我扩展了类PropertiesDataSourceFactory以覆盖这些方法,如下所示:

代码语言:javascript
复制
public class UnitilsDataSourceFactory extends PropertiesDataSourceFactory {

    @Override
    public void init(Properties configuration) {
        try {
            String[] configFiles = new String[] { "applicationContext-test.xml" };
            BeanFactory factory = new ClassPathXmlApplicationContext(configFiles);

            SystemPropertiesReader systemPropertiesReader = (SystemPropertiesReader) factory.getBean("systemPropertiesReader");
            Properties loadProperties = systemPropertiesReader.loadProperties();

            super.init(loadProperties);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public DataSource createDataSource() {
        DataSource dataSource = super.createDataSource();
        return dataSource;
    }

}

还写了一个SystemPropertiesReader:

代码语言:javascript
复制
public class SystemPropertiesReader {

    private Collection<Resource> resources;

    public void setResources(final Collection<Resource> resources) {
        this.resources = resources;
    }

    public void setResource(final Resource resource) {
        resources = Collections.singleton(resource);
    }

    @PostConstruct
    public Properties loadProperties() throws Exception {
        final Properties systemProperties = System.getProperties();
        for (final Resource resource : resources) {
            final InputStream inputStream = resource.getInputStream();
            try {
                systemProperties.load(inputStream);
            } finally {
                //
            }
        }

        return systemProperties;
    }

}

并添加了一个带有属性文件的bean:

代码语言:javascript
复制
<bean id="systemPropertiesReader" class="uk.co.friendslife.eventmanager.domain.dao.SystemPropertiesReader">
            <property name="resource">
                <value>classpath:/META-INF/em/config/eventmanager_${database_name_lower}.properties</value>
            </property>
</bean>

将以下内容添加到unitils.properties:

代码语言:javascript
复制
org.unitils.database.config.DataSourceFactory.implClassName=x.y.UnitilsDataSourceFactory
票数 1
EN

Stack Overflow用户

发布于 2012-02-22 03:19:53

一个潜在的解决方案..。您可以让Spring配置从unitils.properties读取其数据源参数,而不是相反。可能不是很理想。

我相信unitils在幕后使用了spring,因此您也可以尝试使用@SpringApplicationContext在您的unitils测试中添加您的数据源上下文。如果您可以在启动时找出由unitils设置的数据源bean的名称,则可以在您的上下文中覆盖它(假设unitils数据源bean是在其他spring bean之前创建的,这可能是真的,也可能不是真的)。

例如:

@SpringApplicationContext({"correctDataSourceContext.xml"})

编辑:另一个肯定有效的选项:https://stackoverflow.com/a/6561782/411229基本上自己实例化Unitils并手动设置属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9383096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档