如何使用其他配置文件覆盖特定于配置文件的属性?

Pasukaru

我目前在Spring Boot中具有以下配置设置:

application.properties

app.database.host=${DB_HOST}
app.database.port=${DB_PORT}
app.database.name=${DB_NAME}
app.database.user=${DB_USER}
app.database.password=${DB_PASSWORD}
app.database.schema=${DB_SCHEMA:public}
spring.datasource.url=jdbc:postgresql://${app.database.host}:${app.database.port}/${app.database.name}
spring.datasource.username=${app.database.user}
spring.datasource.password=${app.database.password}
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

application-local-dev.properties:

app.database.host=${DB_HOST:localhost}
app.database.port=${DB_PORT:5432}
app.database.name=${DB_NAME:db_name}
app.database.user=${DB_USER:root}
app.database.password=${DB_PASSWORD:root}
app.database.schema=${DB_SCHEMA:public}

application-load-fixtures.properties:

spring.profiles.include=local-dev
spring.profiles.active=load-fixtures,local-dev
app.database.name=${DB_NAME:db_name}_fixtures

这里的想法是,当以默认模式启动应用程序时,如果缺少诸如数据库名称之类的关键属性,它将无法启动。它们应该通过环境变量传递。

出于开发目的,在设置项目时这是不必要的开销,因为我们有一个带有静态凭据的docker容器,我想将它们作为默认值提供。因此,我创建了一个配置文件local-dev该配置文件将使用默认值来连接到我们的docker数据库,并仍然能够通过环境变量覆盖它们,以防有人需要。直到这里,一切正常。

但是现在,我们还有一个配置文件,用于将固定装置加载到数据库中(删除所有表,重新创建并用数据填充它们)。出于明显的原因,我想确保无法在任意数据库上完成此操作,因此我创建了一个配置文件load-fixtures该配置文件应继承local-dev数据库的所有属性并覆盖数据库名称。但是,这种方法似乎是错误的。我可以在spring日志中看到配置文件已正确加载:

2017-11-16 13:32:11.508  INFO 23943 --- [           main] Main:
The following profiles are active: load-fixtures,local-dev

但是它仍然使用local-dev配置文件提供的数据库名称

当我删除线

app.database.name=${DB_NAME:db_name}

local-dev配置文件,它的工作原理。

但是,我想避免的是,每当我们向项目中添加新的配置属性时,都必须同时向local-dev和中load-fixtures添加新属性。

我了解配置文件特定的属性优先于非配置文件特定的属性。而且,非默认位置属性的优先级高于默认位置的属性。但是在这里,两个配置文件(local-devload-fixtures)都位于同一位置,并且它们都是特定于配置文件的。

解决此问题的正确方法是什么?

提前致谢!

击剑者

最近,我遇到了同样的问题,不得不弄清楚Spring适用于几个配置文件特定的属性文件的优先顺序。不幸的是,这没有得到很好的记录,我没有找到负责该代码的位置。

但是,经过一些测试和尝试后,我非常确定它的工作原理如下(或至少以类似的方式):可能使用某种地图来收集所有不同位置和可能性的所有属性,您可以在其中定义它们记录在这里因此,例如,在上述地图中my.value定义了一个属性application.properties并将其存储在该地图中。然后找到与Java系统属性相同的属性。由于这种定义属性的方式在PropertySource-order中较高,因此它将覆盖映射中之前找到的值。到目前为止,根据文档清楚地知道Java系统属性将获胜。

但是,当我们以两个不同的特定于个人档案的属性文件来访问具有相同优先级的两个不同来源时,我认为文档并不是100%清晰的。但是它在24.4中

如果指定了多个配置文件,则采用后赢策略。例如,在通过SpringApplication API配置的配置文件之后,添加了spring.profiles.active属性指定的配置文件,因此具有优先权。

也许仅仅是示例在这里不是最佳选择,或者我只是不正确地理解它。但是我想“最后获胜”策略也适用于例如中定义的所有配置文件spring.profiles.active也就是说,如果您运行java -jar -Dspring.profiles.active=dev,fix application.jar,则中的属性application-fix.properties将覆盖中具有相同键的属性的值application-dev.properties

因此,在您考虑应用程序输出的情况下,我猜您指定了类似的内容java -jar -Dspring.profiles.active=load-fixtures,local-dev application.jar如果我是对的,则只需将其更改为java -jar -Dspring.profiles.active=local-dev,load-fixtures application.jar

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何制作特定于配置文件的 bootstrap.yml?

如何从其他配置文件重新配置openbox

Maven配置文件属性不是“覆盖”

使用PropertiesLauncher启动的Spring-boot(特定于配置文件)应用程序中的问题覆盖应用程序属性

Windows终端-使用其他配置文件启动Powershell

Spring Boot 找不到特定于配置文件的属性文件

使用 Sed 覆盖 url 配置文件

bash配置文件,从其他文件加载配置

Spring Boot属性取决于特定于配置文件的属性

你如何使用PDFBOX(或其他开源Java LIB)提取PDF文件的颜色配置文件

如何使用配置文件提供程序插件从Jenkins管道中的配置文件读取属性

如何防止在特定配置文件上设置属性蜂

从其他配置文件访问配置变量

在ClientInterceptor中使用配置文件属性

如何使用@Configuration排除Spring配置文件以依赖于其他项目

使用特定的Automapper配置文件

Leiningen插件如何为特定于插件的项目部分实现类似配置文件的功能?

在hugo配置文件中使用特定于语言的字符串

我正在尝试使用 python selenium 启动特定于 chrome 的配置文件?

从Spring配置文件中删除其他配置文件

与其他MDM配置文件iOS一起安装VPN配置文件

如何使用信号基于Django中的用户属性创建特定的配置文件

如何将 cypress.json 配置扩展到其他配置文件?

在Spring Boot中覆盖配置文件属性

如何使用lxc配置文件集?

如何使用python读取配置文件

如何使用Gradle复制配置文件

如何使用sed编辑配置文件

OpenVPN如何使用多个配置文件