【发布时间】:2017-11-16 12:42:32
【问题描述】:
我目前在 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}
应用加载-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-dev 和 load-fixtures)都在同一个位置,而且它们也是特定于配置文件的。
解决这个问题的正确方法是什么?
提前致谢!
【问题讨论】:
标签: spring-boot