如何获得包含占位符的属性的原始值?

时间:2016-01-04 04:00:54

标签: java spring spring-el

我正在尝试在我的.properties文件中定义以下属性:

personExpression=${person.surname}

然后由配置类读取:

@Configuration
public class TemplateConfig {
    @Autowired
    private Environment environment;

    public String getPersonExpression() {
        return environment.getProperty("personExpression");
    }
}

然而,这给出了例外:

java.lang.IllegalArgumentException: Could not resolve placeholder 'person.surname' in string value "${person.surname}"

有没有办法让getPersonExpression()返回字符串文字${person.surname}而不尝试解决它?

3 个答案:

答案 0 :(得分:1)

要使其工作,需要一些非常不直观的语法。

您必须将表达式拆分为两部分,并将整个事物包装在父SpEL表达式中以加入它们。

如果您将属性值更改为以下内容,则应该有效:

personExpression=#{'$' + '{person.surname}'}

这是有效的,因为你正在从$分割{person.surname}字符,因此SpEL不会尝试将其作为表达式进行评估,因为就其而言,你只是连接两个字符串在一起。

答案 1 :(得分:1)

我不知道可以通过getRawPropertyValue访问的任何ApplicationContext类型方法。

如果您知道PropertySource的名称,例如。 example,您可以获取ConfigurableEnvironment及其注册的PropertySource,检索相应的AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Sample.class); ConfigurableEnvironment configurableEnvironment = ctx.getEnvironment(); String rawValue = configurableEnvironment.getPropertySources() .get("example") // get property source .getProperty("personExpression"); // get property ,并获取所需的属性值。

rawValue

变量${person.surname}的值为Environment。所有这些都是在任何属性占位符解析器之外完成的。

这显然只适用于使用"My Count is 4"注册的财产来源。

答案 2 :(得分:-1)

您可能知道这一点,但我只是澄清$ {}用于从属性文件中检索属性到XML文件/任何其他有效的文件。

如果你想设置personExpression =" person.surname"并且想要在上面执行它时检索它(environment.getProperty(" personExpression");)你应该在属性文件中定义如下 personExpression = person.surname 。那么它将适用于 environment.getProperty(" personExpression");并在您的函数中返回 person.surname ,希望这有帮助