我尝试传递“${
功能如下:
fun parse(key: String): String {
val context = StandardEvaluationContex()
context.addPropertyAccessor(EnvironmentAccessor())
return SpelExpressionParser().parseExpression(key).getValue(context)
}
您可以使用 @Value 注释并访问您正在使用的 Spring bean 中的属性
@Value("${propertyName}")
private String propertyName;
您(直到现在我也是如此)混淆了“占位符”和“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)
);