【发布时间】:2023-03-07 12:03:01
【问题描述】:
表达式可以用作 Spring application.properties 文件中的右侧值吗?
例如,像这样的:
logging.level.com.acme=#{'${MY_RUN_ENV}'=='PROD'?'WARN':'DEBUG'}
具体来说,不有效。但是,我想知道我是否可以做一些类似于那里的意图
【问题讨论】:
标签: spring spring-boot
表达式可以用作 Spring application.properties 文件中的右侧值吗?
例如,像这样的:
logging.level.com.acme=#{'${MY_RUN_ENV}'=='PROD'?'WARN':'DEBUG'}
具体来说,不有效。但是,我想知道我是否可以做一些类似于那里的意图
【问题讨论】:
标签: spring spring-boot
不,您不能在属性文件中使用 SpEL。
您可以在属性文件中use placeholders,例如:
app.name=MyApp
app.description=${app.name} is a Spring Boot application
对于您的用例,您应该查看profile-specific configuration 机制。
这允许您根据环境配置文件加载不同的配置。
【讨论】:
my-prop: #{'${USERNAME}'.toLowerCase()}-local 这将在使用 @Value("${my-prop}") 时正确解决 但不会 与@ConfigurationProperties相关
SpEL 表达式。但是,可以将SpEL 表达式写入@Value。如果应用程序属性文件中的属性值是 SpEL 表达式,则在通过 @Value 使用时将对其进行评估。"
不,这是不可能的,From spring boot reference:
功能@ConfigurationProperties
SpEL 评估否
相反,您可以在生产环境中使用application-default.properties,并在其中定义loglevel=WARN。
在你的application.properties:
loglevel=DEBUG
logging.level.com.acme=${loglevel}
配置文件特定的属性文件(默认为-default)应该覆盖来自application.properties的属性,更多信息here。
【讨论】:
使用基于配置文件的属性文件。
在 application-dev.properties 中: logging.level.com.acme=警告
在 application-prod.properties 中: logging.level.com.acme=DEBUG
仅供参考,当 spring boot 在基于配置文件的文件中找不到属性时,它使用默认值中的值。因此,您可以在 application.properties 中设置属性,并在其值更改时在基于配置文件的文件中覆盖它们。
【讨论】: