【发布时间】:2016-07-24 11:09:35
【问题描述】:
使用弹簧 3.2.5。 我有一个带有两个应用程序上下文(另一个的父级)的 Web 项目。
我在 xml 中配置了一个像这样的占位符配置器:
<context:property-placeholder location="WEB-INF/properties/*.properties, classpath:local.config.properties, file:${global.config.file}"
ignore-unresolvable="true"
ignore-resource-not-found="false"/>
变量“global.config.file”是传递给启动tomcat的JVM参数中指定的文件的路径。
在我的代码中,我可以像这样成功地从这些文件中注入值:
@Value("${blabla}")
private String blabla;
但是,当我尝试通过 spring 的 Environment 对象以编程方式解析占位符时,占位符不会被实际值替换:
@Inject
Environment env;
// ...
public void test() {
String blabla = env.resolvePlaceholders("${blabla}");
}
blabla 变量将包含它的未解析值:“${blabla}” 另外,做:
env.getProperty("blabla");
返回空值。 请注意,我使用 3.0 以上的上下文模式位置:
http://www.springframework.org/schema/context/spring-context-3.2.xsd
有人可以帮助我了解我缺少什么吗? 或者关于如何进一步调试的任何线索?
【问题讨论】:
-
没有什么可调试的,因为它按设计工作。注册的
PropertySourcesPlaceholderConfigurer使用环境来查找它无法从加载的文件中找到的属性。如果您需要@Configuration类并添加@PropertySource注释,则它不会将加载的属性添加到Environment,因为这些属性已添加到Environment。 -
您想要的只是能够以编程方式获取资源吗?如果是这种情况,请检查this。我目前以这种方式使用它,它适用于属性文件。
-
是的,我想在运行时使用占位符解析字符串表达式。 M. Deinum:这是否意味着如果我通过手动定义 PropertySources 来替换命名空间标签,它会起作用吗?我也需要它在 spring 配置文件中工作。
标签: java spring properties