【发布时间】:2018-06-04 09:18:34
【问题描述】:
在 Spring YAML 配置文件中,我需要一个类似的参数
csv:
file:
pattern: /some/path/${app-name}.csv
${app-name} 在运行时被 Java 代码动态替换,我不希望 Spring 在启动时替换它。
为此,我需要转义 $ 字符,以便 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 文件中,# 是行注释字符,从该字符开始的所有内容都将被忽略。如果我使用\#,则\ 会被传递给字符串。
添加:Spring project open issue 9628 自 2008 年 6 月 25 日起开放:
目前无法注入不会被 PropertyPlaceholderConfigurer 拾取的 ${...} 表达式。理想情况下,我们应该能够注入一个包含 ${...} 的字符串以供以后在其目标 bean 中使用,而无需 PropertyPlaceholderConfigurer 的参与。
【问题讨论】:
-
能否请您在使用
csv.file.pattern的地方发布代码?我确定第三个转义选项有效,因为我也(成功地)使用过它 -
我使用 Spring Boot 使用 YAML 文件 (application.yml) 进行的测试已正确注入了值。我使用
@Value("${csv.file.pattern}")注解注入模式,我得到了/some/path/${app-name}.csv结果,正如预期的那样。由于某种原因这对您不起作用,您的设置可能会有所不同,我正在尝试确定有什么区别。据我所知,可能是 YAML 库、Spring 版本等方面的差异。 -
只是澄清一下,虽然它可能与您之后如何使用变量无关,但它绝对与您如何注入它有关,这就是我想问问。
-
@AlexSavitsky 啊哈,我用的不是
@Value,而是@ConfigurationProperties。 -
pattern: "/some/path/#{'$'}{app-name}.csv"为我工作。我使用了@Value 注释。为什么不使用@Value?
标签: java spring escaping yaml spring-el