如何在春季YAML配置中逃脱SpEL美元符号?

2022-09-04 21:18:45

在Spring YAML配置文件中,我需要有一个参数,如

csv:
  file:
    pattern: /some/path/${app-name}.csv

其中,Java代码在运行时动态替换,我不希望Spring在启动时替换它。${app-name}

为了实现这一点,我需要对角色进行转义,这样Spring就不会将其解释为SpEL$

以下答案在 YAML 中不起作用

我尝试了所有组合,例如

pattern: /some/path/\${app-name}.csv
pattern: "/some/path/\${app-name}.csv"
pattern: /some/path/#{'$'}{app-name}.csv
pattern: "/some/path/#{'$'}{app-name}.csv"

并且它们都没有生成包含所请求字符串的变量,带有美元符号但没有转义字符。

请注意,它是 YAML 配置。在 YAML 文件中,是行注释字符,从此字符开始的所有内容都将被忽略。如果我使用 ,则传递给字符串。#\#\

新增:自2008年6月25日以来,春季项目开放问题9628已开放:

目前没有办法注入一个${...}表达式,它不会被PropertyPlaceholderConfigurer拾取。理想情况下,我们应该能够注入一个包含 ${...} 的字符串,以便以后在其目标 Bean 中使用,而无需 PropertyPlaceholderConfigurer 的参与。


答案 1

我有同样的问题,我只是发现愚蠢的聪明的解决方案定义了一个名为dollarSign或简称ds的属性。

ds: "$"

然后像这样使用它,将在运行时被替换。${ds}$

csv:
  file:
    pattern: /some/path/${ds}{app-name}.csv

当它工作时,这有点滑稽。


答案 2

我遇到了同样的问题。因此,您可以通过使用 yaml 文本样式符号 “” 或使用 literal_strip “” 来解决此问题,如下面的示例所示。||-

应用程序.yml

csv:
  file:
    pattern: |-
      /some/path/${app-name}.csv

实际上,我的问题是在yml中配置一个公式,然后在java中动态解析表达式。在此处共享解决方案。

我选择弹簧el解决方案,并使用弹簧版本。5.0.9.RELEASE

我用yml定义了一个公式,

score:
  formula: |-
    10 * #x + #y

然后在弹簧组件豆中,

@Value("${score.formula}")
String scoreFormula;

最后通过使用弹簧el,

ExpressionParser parser = new SpelExpressionParser();
EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();

context.setVariable("x", 1);
context.setVariable("y", 1);
Integer score = parser.parseExpression(scoreFormula).getValue(context,Integer.class);

参考

yaml-multi-line