【问题标题】:Using Expressions in Spring application.properties file在 Spring application.properties 文件中使用表达式
【发布时间】:2023-03-07 12:03:01
【问题描述】:

表达式可以用作 Spring application.properties 文件中的右侧值吗?

例如,像这样的:

logging.level.com.acme=#{'${MY_RUN_ENV}'=='PROD'?'WARN':'DEBUG'}

具体来说,有效。但是,我想知道我是否可以做一些类似于那里的意图

【问题讨论】:

    标签: spring spring-boot


    【解决方案1】:

    不,您不能在属性文件中使用 SpEL。

    Finally, while you can write a SpEL expression in @Value, such expressions are not processed from Application property files.

    您可以在属性文件中use placeholders,例如:

    app.name=MyApp
    app.description=${app.name} is a Spring Boot application
    

    对于您的用例,您应该查看profile-specific configuration 机制。

    这允许您根据环境配置文件加载不同的配置。

    【讨论】:

    • 为了完整起见,为了让这个冗长的 b/ci 不要理解这个:你可以把它放到你的属性文件中:my-prop: #{'${USERNAME}'.toLowerCase()}-local 这将在使用 @Value("${my-prop}") 时正确解决 但不会@ConfigurationProperties相关
    • 此行为已更改:“在解析这些文件和填充环境时,不会处理来自应用程序属性文件的SpEL 表达式。但是,可以将SpEL 表达式写入@Value。如果应用程序属性文件中的属性值是 SpEL 表达式,则在通过 @Value 使用时将对其进行评估。"
    【解决方案2】:

    不,这是不可能的,From spring boot reference:

    功能@ConfigurationProperties

    SpEL 评估否

    相反,您可以在生产环境中使用application-default.properties,并在其中定义loglevel=WARN。 在你的application.properties:

    loglevel=DEBUG
    logging.level.com.acme=${loglevel}
    

    配置文件特定的属性文件(默认为-default)应该覆盖来自application.properties的属性,更多信息here

    【讨论】:

      【解决方案3】:

      使用基于配置文件的属性文件。

      在 application-dev.properties 中: logging.level.com.acme=警告

      在 application-prod.properties 中: logging.level.com.acme=DEBUG

      仅供参考,当 spring boot 在基于配置文件的文件中找不到属性时,它使用默认值中的值。因此,您可以在 application.properties 中设置属性,并在其值更改时在基于配置文件的文件中覆盖它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-28
        • 2021-12-08
        • 1970-01-01
        • 2015-05-23
        • 2020-04-26
        • 2013-09-08
        • 2015-04-20
        • 2016-02-12
        相关资源
        最近更新 更多