我有一个使用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].
任何想法我做错了什么?
答案 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"/>