【发布时间】:2011-09-17 06:20:03
【问题描述】:
我有一个应用程序,其中属性占位符用于读取属性,在applicationContext.xml 中配置:
...
<context:property-placeholder
location="classpath*:META-INF/spring/*.properties"/>
...
应用程序在 Tomcat 中运行并使用 context.xml 中定义的参数。
应用程序像普通属性一样访问此参数 (@Value(${cfma.applicationUrl}))。 这行得通
在我的测试用例中,我没有这个 tomcat 属性,所以我想将它们“手动”添加到应用程序上下文中。但也可以正常加载applicationContext.xml
testContext.xml:
<import resource="classpath:/META-INF/spring/applicationContext.xml" />
<context:property-placeholder properties-ref="simulatedTomcatProperties"/>
<util:properties id="simulatedTomcatProperties">
<prop key="cfmt.applicationBaseUrl">localhost:8080/cfmt</prop>
</util:properties>
现在我有两个上下文:property-placeholder,这不起作用(当然) - 所以我的问题是,我可以在我的测试中扩展“正常”属性占位符中的属性吗?强>
我需要的更多解释:
- 生产环境(以及开发环境)通过 Tomcat 参数定义了一些属性。因此它们不包含在任何属性文件中,但可以像普通属性一样轻松访问它们 (
@Value(${cfma.applicationUrl}))。而且不能有任何Fallback,如果Tomcat中没有定义属性,应用程序一定不能启动! - 在测试用例(使用 spring 上下文)中,我必须了解如何插入属性 (cfma.applicationUrl),以便可以将其注入带注释的变量中。
但是,如果我添加第二个
context:property-placeholder,它们不会合并:
@查看https://jira.springsource.org/browse/SPR-4881 上的评论——他们解释了这种行为。
当我谈论 Tomcat 参数时,我是在谈论这样的想法:
context.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Parameter name="cfmt.applicationBaseUrl"
value="http://localhost/demoApp" override="false"/>
</Context>
【问题讨论】:
-
见stackoverflow.com/questions/6375016/… 它有效地允许您定义多个属性位置。忽略缺少的属性文件,并加载列出的最后一个有效文件。
-
@Filip:我的问题与多个位置无关。我被多个属性占位符配置器困住了。我正在寻找一种方法来从我的 test-context.xml 扩展/更改“普通”应用程序上下文属性占位符配置器的配置
-
对不起。我的评论不是很清楚,我不是在建议一种指定多个属性文件的方法,而是一种进行条件属性查找的方法。扩展答案如下。
标签: java unit-testing spring properties