【问题标题】:Using JNDI for for my datasource and location of properties files将 JNDI 用于我的数据源和属性文件的位置
【发布时间】:2012-04-19 14:52:42
【问题描述】:

我想在我的 spring mvc 应用程序中使用 jndi 来做两件事:

  1. 数据源设置
  2. 存储我的属性文件的位置,以便我可以在我的代码中进行查找

我实际上有 2 个应用程序,1 个是 spring mvc,另一个是 spring,所以我计划对两者使用相同的 jndi 设置。

另外,这 2 个应用程序在不同的包含(tomcat 和码头)上运行,我以前从未使用过 jndi,所以我希望我可以在一个位置定义它并让两个应用程序指向同一个 jndi 文件(假设它是文件)。

至于 #1,我的 spring 上下文文件中的数据源设置当前是:

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost/mydb_development"/>
        <property name="username" value="devuser1"/>
        <property name="password" value="123"/>

        <property name="maxActive" value="100"/>
        <property name="maxIdle" value="30"/>
        <property name="maxWait" value="1000"/>
        <property name="defaultAutoCommit" value="true"/>
        <property name="removeAbandoned" value="true"/>
        <property name="removeAbandonedTimeout" value="60"/>

        <property name="testOnBorrow" value="true"/>
        <property name="validationQuery" value="SELECT 1"/>

    </bean>

有人可以告诉我如何将其提取出来以使用 JNDI,很困惑,它是必须在我的类加载器中的单独文件,还是我在我的 spring 上下文文件中硬编码路径?

至于#2,在我的代码中,我目前正在加载一个位于我的类路径中的属性文件,例如:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream is = classLoader.getResourceAsStream("test.properties");

现在 test.properties 文件在我的类路径中,所以它可以开箱即用,但我想知道/理解的是我是否可以以某种方式使用 jndi 来查找属性文件的位置(如果这有意义吗? ) 并且可能在我的类路径中没有此文件。

我在谷歌上搜索了一下,我知道在春天我可以使用以下方法引入 jndi:

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/mysqlDataSource" />

但我不明白的是,具有设置的实际文件在哪里?它可以在我的 web.xml 文件以外的位置吗? (我的另一个应用程序再次使用 spring,但它是一个守护进程,因此它没有 web.xml 文件)。

我的目标是能够更改 jndi 文件的值(如用户名、密码、文件路径),而不是将这些值嵌入到 jar 中。我希望能够在生产服务器或开发服务器上手动编辑这些文件,然后重新启动容器。

【问题讨论】:

  • 如果你真的只是指设置,我会避免使用 JNDI。几乎总是有更简单的方法可以将特定于机器的配置文件位置放入您的应用程序中。我已经从使用 JNDI 切换到使用 webdefaults.xml 文件来填充上下文参数。

标签: java spring maven jndi


【解决方案1】:

我对 spring 有点生疏,但我记得使用 PropertyPlaceHolderConfigurer,类似于:

<bean id="propertyPlaceholderConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="ignoreResourceNotFound">
            <value>true</value>
        </property>
        <property name="ignoreUnresolvablePlaceholders">
            <value>true</value>
        </property>
        <property name="locations">
            <list>
                <value>file:path to your file
                </value>
                <value>file:path to another file if needed
                </value>
            </list>
        </property>
    </bean>

然后您可以直接使用列表中定义的 .properties 上的值。即,如果您有类似的属性

db.driver=com.mysql.jdbc.Driver

你可以像这样使用它

bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
        <property name="driverClassName" value="${db.driver}"/>

当你想定义一个值时。

如果您想进一步控制文件,可以在您的服务器上注册文件本身的路径,您可以通过JNDI查找它,更改

file:path to your file 

进入

file:${propertiesFilePath}

我很确定您也可以通过正常的 JNDI 查找通过代码查找这些配置属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2014-05-28
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    相关资源
    最近更新 更多