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

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 在你的函数中,希望这有助于