如何在Spring YAML配置中逃避SpEL美元符号?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Spring YAML配置中逃避SpEL美元符号?相关的知识,希望对你有一定的参考价值。

在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目前不提供属性占位符的转义机制,有一个open issue。在评论中,提到了这种解决方法(我不确定它是否适用于YAML):

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

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

另一答案

答案实际上取决于您在代码中注入值的确切方式。由于您尚未提供,我将列出各种工作技巧。

  1. 您可以使用@Value注释来注入您的属性。因为,unlike @ConfigurationProperties, @Value does SpEL evaluation,你必须逃避你的价值。

application.yml:

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

test controller.Java:

@RestController
public class TestController {
    @Value("${csv.file.pattern}") private String pattern;
    @GetMapping("pattern") public ResponseEntity<String> getPattern() {
        return ResponseEntity.ok(pattern);
    }
}

/pattern的GET会产生输出/some/path/#{app-name}.csv,就像你需要的那样

  1. 您可以使用@ConfigurationProperties,这里它实际上取决于您如何构造配置对象。但是,一般情况下,@ConfigurationProperties不需要转义,因为默认情况下它们不支持SpEL。但是,以下是有效的,因此如果您的设置不同,请对其进行修改:

application.yml:

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

config.Java:

@ConfigurationProperties(prefix = "csv.file")
public class Config {
    private String pattern;
    public String getPattern() { return pattern; }
    public void setPattern(String pattern) { this.pattern = pattern; }
}

test controller.Java:

@RestController
public class TestController {
    @Autowired private Config config;
    @GetMapping("pattern") public ResponseEntity<String> getPattern() {
        return ResponseEntity.ok(config.getPattern());
    }
}

同样,对/pattern的GET将导致输出/some/path/#{app-name}.csv

您最有可能的是Config.java中的一些不同结构(可能会发布相关代码?),这可能导致属性无法正确处理。

以上是关于如何在Spring YAML配置中逃避SpEL美元符号?的主要内容,如果未能解决你的问题,请参考以下文章

Spring表达式语言:SpEL语法

Spring表达式语言:SpEL语法

Spring框架bean的配置:SpEL:引用 Bean属性和方法。。。

如何使用 YAML 文件在 Spring Boot 中配置 Swagger?

在 Spring bean 有条件地设置属性值时,SpEL 条件运算符未按预期进行评估(使用 XML 配置)

在 Grails 中使用自己的方法扩展 SpEL?