我想在我的 spring mvc 应用程序中使用 jndi 来做两件事:
- 数据源设置
- 存储属性文件的位置,以便我可以在代码中进行查找
我实际上有 2 个应用程序,1 个是 spring mvc,另一个是 spring,所以我计划对这两个应用程序使用相同的 jndi 设置。
另外,这两个应用程序运行在不同的包含(tomcat 和 jetty)上,我以前从未使用过 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 来查找属性文件的位置(如果这有意义? )并且可能没有这个文件在我的类路径中。
我用谷歌搜索了一下,我知道在 Spring 我可以使用 jndi 来引入:
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/mysqlDataSource" />
但我不明白的是,具有设置的实际文件在哪里?它可以位于 web.xml 文件以外的位置吗? (我的另一个应用程序再次使用 spring,但它是一个守护进程,因此它没有 web.xml 文件)。
我的目标是能够更改 jndi 文件的值(如用户名、密码、文件路径),而不是将它们嵌入到 jar 中。我希望能够在生产服务器或开发服务器上手动编辑这些文件,然后重新启动容器。
最佳答案
我对 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 上的值。即,如果您有类似的属性(property)
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 查找通过代码查找这些配置属性。
关于java - 使用 JNDI 作为我的数据源和属性文件的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10230759/