当前位置: 首页 > 知识库问答 >
问题:

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

纪秋月
2023-03-14

在Spring YAMLhtml" target="_blank">配置文件中,我需要有一个参数,例如

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

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

为了实现这一点,我需要转义$字符,以便Spring不会将其解释为SpEL。

以下答案在YAML不适用:

>

  • \$如何逃脱EL美元符号?

    #{'$'}Spring属性文件中的转义属性引用

    如果包含美元符号(${var}),则无法读取属性

    我尝试了所有的组合,比如

    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 日起,有一个 Spring 项目开放期 9628:

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

  • 共有3个答案

    淳于嘉树
    2023-03-14

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

    应用程序. yml

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

    其实我的问题是在yml中配置一个公式,然后在java中动态解析表达式。在这里分享解决方案。

    我选择spring el解决方案,使用spring版本< code>5.0.9.RELEASE。

    我在yml中定义了一个公式,

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

    然后在Spring成分豆中,

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

    最后通过使用spring 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-多行

    能远
    2023-03-14

    Spring目前没有为属性占位符提供转义机制,有一个公开的问题(于2008年6月25日公开)。在评论中,提到了这个解决方法(我不确定它是否适用于YAML):

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

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

    马天逸
    2023-03-14

    我也有同样的问题,我刚刚发现<罢工>哑的聪明的解决方案定义了一个名为dollarSign或ds的属性。

    ds: "$"
    

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

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

    当它起作用的时候有点好笑。

     类似资料:
    • 我正在阅读Log4j2的配置部分。http://logging.apache.org/log4j/2.x/manual/configuration.html 双$$符号是什么意思?e、 g.$${sd:type}?

    • 在模块化的Spring配置应用程序中,我们使用工厂bean跨模块边界提供bean实例。 例如,一个模块A可以通过名称name公开一个bean实例。然后,另一个模块B可以通过样式声明来使用该bean 请注意,模块具有分离的类加载器层次结构,并且A/name的实际实现类在B中可能不可见。就像在OSGI中一样(尽管这不是OSGi)。 我的目标是在 B 的编程应用程序上下文中提供 A/name。但是在尝试

    • 问题内容: 我想要grep ,我希望结果是 为了区分,我将提示标记为。 这里有什么问题? 应该采取什么 grep的字符串 是什么? 问题答案: 问题在于外壳程序在双引号字符串内扩展了变量名。因此,它尝试读取以first开头的变量名。 另一方面,单引号中的变量不会扩展。因此,如果不是因为在正则表达式中表示行尾的特殊字符这一事实,那 将是 可行的。因此需要进行转义:。

    • 问题内容: 我正在用XML编写一些SpEL语句,但无法让解析器确定何时需要转义字符。 我尝试了以下操作: 但是,添加\似乎并不能避免使用单引号,并且我一直收到解析器异常。 有什么办法可以逃避这些价值观? 问题答案: 从文档中: “要将单引号本身放在字符串中,请使用两个单引号字符。”

    • 请告诉我如何在udf中使用hive conf变量,以及如何在hive udf中访问hive配置?

    • 如何在JasperStudio软件中自动添加Textfield中的美元符号?我有一个报告显示价格,我想jasper studio添加一个自动的$符号。