Java 如何获取包含占位符的属性的原始值?
我正在尝试在我的一个.properties文件中定义以下属性:Java 如何获取包含占位符的属性的原始值?,java,spring,spring-el,Java,Spring,Spring El,我正在尝试在我的一个.properties文件中定义以下属性: personExpression=${person.surname} 然后由配置类读取: @Configuration public class TemplateConfig { @Autowired private Environment environment; public String getPersonExpression() { return environment.getPr
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}"
有没有一种方法可以执行get
getPersonExpression()
来返回字符串literal${person.姓氏}
,而不尝试解析它?要使其工作,需要一些非常不直观的语法
基本上,您必须将表达式拆分为两部分,并将整个内容包装在父SpEL表达式中,以将它们连接起来
如果将属性值更改为以下值,则应该可以使用:
personExpression=#{'$' + '{person.surname}'}
这是因为您正在将
$
字符从{person.nam姓氏}
中分离出来,所以SpEL不会尝试将其作为表达式进行计算,因为就其而言,您只是将两个字符串连接在一起。我不知道有任何getRawPropertyValue
类型方法可以通过ApplicationContext
访问
如果您知道PropertySource
的名称,例如示例
,则可以获取可配置环境
,及其注册的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.la姓氏}
。所有这些都是在任何属性占位符解析器之外完成的
这显然只适用于在
环境注册的属性源您可能知道这一点,但我只是澄清一下${}用于从属性文件中检索属性到XML文件/任何其他有效文件
如果您试图设置personExpression=“person.Nastname”,并希望在执行上述操作时检索它(environment.getProperty(“personExpression”);),您应该在属性文件中这样定义personExpression=person.Nastname。然后它将与环境.getProperty(“personExpression”)一起工作;并在函数中返回person.namite,希望这对您有所帮助是否需要添加一些额外的配置来让spring在#{..}中计算表达式?我尝试将属性更改为{$'+'{person.nam姓氏}}
,但是getPersonExpression()
只返回{$'+'{person.nam姓氏}}
是否使用PropertyPlaceHolderConfigure
bean?这应该读取属性文件,解析值,然后使它们可用。如果没有,那么属性文件将不会使用SpEL.yes解析。这就是问题所在。我没有注册propertyplaceholderconfigure
bean,因为没有其他正在评估的属性。添加@Bean公共静态属性资源占位符配置器属性资源占位符配置器(){返回新属性资源占位符配置器();}
成功。此外,我还对格式进行了一些修改,将属性更改为personExpression=#{'$}{person.姓氏}
,该属性仍然有效,并且更易于阅读。此外,似乎只有使用@Value(${personExpression})检索属性时,该属性才有效。
environment.getProperty(“personExpression”)
只返回{'$}{person.Lastname}
而不进行评估在我的例子中,我能够在ConfigurableEnvironment
中@Autowire
并跳过检索上下文。一切都一样。