如何使用 SpelExpressionParser 从 application.properties 获取值?

问题描述 投票:0回答:2

我尝试传递“${}”作为关键参数,但得到:“解析有效表达式后,表达式中还有更多数据:'lcurly({)'”。

功能如下:

fun parse(key: String): String {
        val context = StandardEvaluationContex()
        context.addPropertyAccessor(EnvironmentAccessor())

        return SpelExpressionParser().parseExpression(key).getValue(context)
}
spring spring-el
2个回答
0
投票

您可以使用 @Value 注释并访问您正在使用的 Spring bean 中的属性

@Value("${propertyName}")
private String propertyName;

0
投票

您(直到现在我也是如此)混淆了“占位符”和“Spring 表达式语言”的概念。后者可以评估“属性”,但这意味着访问例如一种 Bean getter 方法。它并不意味着

application.properties
文件值。

您正在尝试使用 SpEL 表达式执行占位符替换,这是不可能的。

为了理解 Spring 是如何做到这一点的,我深入研究了 Spring 如何处理

@Value
注解的调用顺序:

  • AutowiredAnnotationBeanPostProcessor.postProcessProperties()
  • AutowireCapableBeanFactory.resolveDependency()
  • AbstractEnvironment.resolvePlaceholders()

基本上你可以做的是这样的:

    var evaluationContext = new StandardEvaluationContext();
    Environment environment = createEnvironment(); // your code 
    System.out.println(parser
            .parseExpression("resolvePlaceholders('${app.my-value}')")
            .getValue(evaluationContext, environment)
    );

var evaluationContext = new StandardEvaluationContext();
evaluationContext.addPropertyAccessor(new EnvironmentAccessor());

Environment environment = createEnvironment(); // your code 
System.out.println(parser
        .parseExpression("['app.my-value']")
        .getValue(evaluationContext, environment)
);
© www.soinside.com 2019 - 2024. All rights reserved.