Spring 加载所有 JNDI 属性
Spring Loading all JNDI Properties
我有一个 spring 应用程序,它使用 tomcat 作为它的容器。 Tomcat 的 context.xml 有以下条目:
<Resource name="jdbc/DB" auth="Container" type="javax.sql.DataSource"
username="postgres" password=""
url="jdbc:postgresql://localhost:5432/postgres"
driverClassName="org.postgresql.Driver"/>
<Environment name="ws.url" type="java.lang.String" value="http://localhost:8088/" />
使用以下 xml 配置可以很好地加载资源:
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/DB" expected-type="javax.sql.DataSource" />
但我尝试使用以下 xml 配置加载环境变量:(这里我试图将 ${url} 设置为 http://localhost:8088/",如 context.xml 文件)
<bean id="databaseprops" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="properties">
<bean class="java.util.Properties">
<constructor-arg>
<map>
<entry key="url">
<jee:jndi-lookup jndi-name="java:comp/env/ws.url"/>
</entry>
</map>
</constructor-arg>
</bean>
</property>
</bean>
但是我得到以下错误:
javax.naming.NameNotFoundException: Name [ws.url] is not bound in this Context. Unable to find [ws.url].
知道我做错了什么吗?
我设法解决了这个问题,技术上有两个问题。
抛出 NameNotFound
异常是因为我犯了一个愚蠢的错误,使用了错误版本的 tomcat 即我在 context.xml 中输入了上面的 XML tomcat 7 实例,但 运行 使用 tmocat 8(我有多个版本用于测试目的)。
在我修复后,我收到一个新错误 ${url}
没有得到解决。我通过删除 bean databaseprops
并只保留类型为 java.util.Properties
的内部 bean 并给它一个 id 来解决这个问题,导致以下 XML 配置:
<bean id="contextProperties" class="java.util.Properties">
<constructor-arg>
<map>
<entry key="url">
<jee:jndi-lookup jndi-name="java:comp/env/ws.url"/>
</entry>
</map>
</constructor-arg>
</bean>
然后我添加了以下 xml 配置来告诉 Spring 使用上面的 bean 来解析属性。
<context:property-placeholder properties-ref="contextProperties"/>
我有一个 spring 应用程序,它使用 tomcat 作为它的容器。 Tomcat 的 context.xml 有以下条目:
<Resource name="jdbc/DB" auth="Container" type="javax.sql.DataSource"
username="postgres" password=""
url="jdbc:postgresql://localhost:5432/postgres"
driverClassName="org.postgresql.Driver"/>
<Environment name="ws.url" type="java.lang.String" value="http://localhost:8088/" />
使用以下 xml 配置可以很好地加载资源:
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/DB" expected-type="javax.sql.DataSource" />
但我尝试使用以下 xml 配置加载环境变量:(这里我试图将 ${url} 设置为 http://localhost:8088/",如 context.xml 文件)
<bean id="databaseprops" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="properties">
<bean class="java.util.Properties">
<constructor-arg>
<map>
<entry key="url">
<jee:jndi-lookup jndi-name="java:comp/env/ws.url"/>
</entry>
</map>
</constructor-arg>
</bean>
</property>
</bean>
但是我得到以下错误:
javax.naming.NameNotFoundException: Name [ws.url] is not bound in this Context. Unable to find [ws.url].
知道我做错了什么吗?
我设法解决了这个问题,技术上有两个问题。
抛出 NameNotFound
异常是因为我犯了一个愚蠢的错误,使用了错误版本的 tomcat 即我在 context.xml 中输入了上面的 XML tomcat 7 实例,但 运行 使用 tmocat 8(我有多个版本用于测试目的)。
在我修复后,我收到一个新错误 ${url}
没有得到解决。我通过删除 bean databaseprops
并只保留类型为 java.util.Properties
的内部 bean 并给它一个 id 来解决这个问题,导致以下 XML 配置:
<bean id="contextProperties" class="java.util.Properties">
<constructor-arg>
<map>
<entry key="url">
<jee:jndi-lookup jndi-name="java:comp/env/ws.url"/>
</entry>
</map>
</constructor-arg>
</bean>
然后我添加了以下 xml 配置来告诉 Spring 使用上面的 bean 来解析属性。
<context:property-placeholder properties-ref="contextProperties"/>