如何在 Spring YAML 配置中转义 SpEL 美元符号?

Hon*_*dek 9 java spring yaml escaping spring-el

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

csv:
  file:
    pattern: /some/path/${app-name}.csv
Run Code Online (Sandbox Code Playgroud)

其中,${app-name}在运行时由Java代码动态地更换,我不想春在启动更换。

为了实现这一点,我需要对$字符进行转义,以便 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"
Run Code Online (Sandbox Code Playgroud)

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

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

添加:自 2008 年 6 月 25 日以来,已有一个Spring 项目公开问题 9628公开:

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

小智 5

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

ds: "$"
Run Code Online (Sandbox Code Playgroud)

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

csv:
  file:
    pattern: /some/path/${ds}{app-name}.csv
Run Code Online (Sandbox Code Playgroud)

它工作时有点有趣。


fly*_*lyx 3

Spring 目前不提供属性占位符的转义机制,有一个未解决的问题(于 2008 年 6 月 25 日开放):

目前无法注入占位符表达式 ( ${...})

在评论中,提到了这个解决方法(我不确定它是否适用于 YAML):

csv:
  file:
    pattern: /some/path/#{'$'}{app-name}.csv
Run Code Online (Sandbox Code Playgroud)

请注意,在 YAML 中,当在空格之后或行首使用时,#会开始注释。