我正在尝试在我的.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}
而不尝试解决它?
答案 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 ,希望这有帮助