【问题标题】:Spring environment cannot resolve placeholdersSpring 环境无法解析占位符
【发布时间】: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


【解决方案1】:

试试classpath*:,例如:

<context:property-placeholder location="classpath*:WEB-INF/properties/*.properties, classpath*:local.config.properties, file:${global.config.file}"
                          ignore-unresolvable="true"
                          ignore-resource-not-found="false"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 2018-02-20
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 2020-10-05
    相关资源
    最近更新 更多