如何获取包含占位符的 属性 的原始值?
How to get raw value of property containing placeholders?
我正在尝试在我的一个 .properties 文件中定义以下 属性:
personExpression=${person.surname}
然后由配置读取 class:
@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()
获取到 return 字符串文字 ${person.surname}
?
要让它工作需要一些非常不直观的语法。
您基本上必须将表达式分成两部分,并将整个内容包装在父 SpEL 表达式中以连接它们。
如果您将 属性 值更改为以下值,它应该可以工作:
personExpression=#{'$' + '{person.surname}'}
这是可行的,因为您将 $
字符与 {person.surname}
字符分开,因此 SpEL 不会尝试将其作为表达式求值,因为就它而言,您只是将两个字符串连接在一起。
我不知道有任何 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
.
注册的 属性 来源
你可能知道这一点,但我只是想说明 ${} 用于从属性文件中检索 属性 到 XML 文件/任何其他有效文件。
如果您尝试设置 personExpression= "person.surname" 并希望像上面那样检索它 (environment.getProperty("personExpression");) 您应该这样定义 personExpression= person.surname 在你的属性文件中。然后它将与 environment.getProperty("personExpression") 一起使用;和 returns person.surname 在你的函数中,希望这有助于
我正在尝试在我的一个 .properties 文件中定义以下 属性:
personExpression=${person.surname}
然后由配置读取 class:
@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()
获取到 return 字符串文字 ${person.surname}
?
要让它工作需要一些非常不直观的语法。
您基本上必须将表达式分成两部分,并将整个内容包装在父 SpEL 表达式中以连接它们。
如果您将 属性 值更改为以下值,它应该可以工作:
personExpression=#{'$' + '{person.surname}'}
这是可行的,因为您将 $
字符与 {person.surname}
字符分开,因此 SpEL 不会尝试将其作为表达式求值,因为就它而言,您只是将两个字符串连接在一起。
我不知道有任何 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
.
你可能知道这一点,但我只是想说明 ${} 用于从属性文件中检索 属性 到 XML 文件/任何其他有效文件。
如果您尝试设置 personExpression= "person.surname" 并希望像上面那样检索它 (environment.getProperty("personExpression");) 您应该这样定义 personExpression= person.surname 在你的属性文件中。然后它将与 environment.getProperty("personExpression") 一起使用;和 returns person.surname 在你的函数中,希望这有助于