Spring加载所有JNDI属性

时间:2015-08-19 05:58:27

标签: xml spring tomcat jndi

我有一个使用tomcat作为容器的spring应用程序。 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].

任何想法我做错了什么?

1 个答案:

答案 0 :(得分:0)

我设法解决了这个问题,技术上存在两个问题。

抛出NameNotFound异常是因为我犯了使用错误版本的tomcat的愚蠢错误,即我在tomcat 7实例的context.xml中输入上述XML但是使用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"/>