无法解析占位符 | Spring占位符

4

我正在尝试在我的应用程序中首次使用Spring的<context:property-placeholder>,遇到了一些问题,我已经尝试了很多方法,包括谷歌搜索和SO上的一些帖子。

我有一个Web应用程序,并需要将一些密钥传递给底层类,考虑使用占位符来实现。这是我的应用程序结构:

Main
  -java
  -resources
  -webapp

我有一个位于resource文件夹内的project.properties文件,我正在尝试这样做:
<context:property-placeholder location="classpath:resources/project.properties" />
<beans:bean id="reCaptcha" class="net.tanesha.recaptcha.ReCaptchaImpl">
  <beans:property name="privateKey" value="${demo.recapatcha_private_key}"/>
   <beans:property name="publicKey" value="${demo.recapatcha_public_key}"/>
</beans:bean>

但是在服务器启动时,我遇到了以下异常。
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'reCaptcha' defined in ServletContext resource [/WEB-INF/spring/appServlet/servlet-context.xml]: Could not resolve placeholder 'demo.recapatcha_private_key'

我已经尝试将project.properties文件放置在不同的位置,其中包括WEB-INF/classeswebapp的几个其他位置,但没有成功。不确定我做错了什么。

1个回答

6
看起来你正在使用Maven项目结构。将你的project.properties文件放在src/main/resources中是资源文件的正常做法,因为Maven会自动将这些文件传输到最终构件的类路径中,该路径将位于war包内的/WEB-INF/classes
然而,你应该修改<context:property-placeholder>标签的location属性,并删除resources文件夹前缀。当构建war文件时,resources文件夹本身不会被传输到/WEB-INF/classes中,因此不会成为运行时类路径的一部分。只有文件夹内容被传输。
<context:property-placeholder location="classpath:project.properties" />

1
我已经尝试了你建议的方法,但是没有成功,事实上我的理解和你所概述的一样。 - Umesh Awasthi
<context:property-placeholder>声明和占位符本身都在servlet-context.xml中定义吗? - Will Keeling
是的,这两个在同一个文件中以相同的顺序定义。 - Umesh Awasthi
你是在独立应用服务器上运行时遇到问题,还是在IDE中运行应用服务器时遇到的?如果是在IDE中,IDE可能会干扰运行时类路径,因此可能无法获取文件。 - Will Keeling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接