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"/>