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

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

我正在尝试在我的一个.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}"

有没有一种方法可以执行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
并跳过检索上下文。一切都一样。