From 2550f71bc59d35b976f6a34e17594ec7b4050caf Mon Sep 17 00:00:00 2001 From: Sharang Gupta Date: Thu, 15 Oct 2026 12:41:07 +0100 Subject: [PATCH] Document the order of application and profile specific files The environment repository page explains the precedence rules in general terms, but it does not say where a file named after both the application and a profile, such as foo-dev.yml, ranks against application-dev.yml, foo.yml and application.yml. * List the order of these files for the sample client of the page, for native, Git and SVN repositories and one search location. * Add a NativeEnvironmentRepository test that pins this order. Fixes gh-1868 Signed-off-by: Sharang Gupta --- .../ROOT/pages/server/environment-repository.adoc | 11 +++++++++++ .../NativeEnvironmentRepositoryTests.java | 15 +++++++++++++++ .../resources/test/precedence/application-dev.yml | 1 + .../test/precedence/application-mysql.yml | 1 + .../resources/test/precedence/application.yml | 1 + .../test/resources/test/precedence/orders-dev.yml | 1 + .../resources/test/precedence/orders-mysql.yml | 1 + .../src/test/resources/test/precedence/orders.yml | 1 + 8 files changed, 32 insertions(+) create mode 100644 spring-cloud-config-server/src/test/resources/test/precedence/application-dev.yml create mode 100644 spring-cloud-config-server/src/test/resources/test/precedence/application-mysql.yml create mode 100644 spring-cloud-config-server/src/test/resources/test/precedence/application.yml create mode 100644 spring-cloud-config-server/src/test/resources/test/precedence/orders-dev.yml create mode 100644 spring-cloud-config-server/src/test/resources/test/precedence/orders-mysql.yml create mode 100644 spring-cloud-config-server/src/test/resources/test/precedence/orders.yml diff --git a/docs/modules/ROOT/pages/server/environment-repository.adoc b/docs/modules/ROOT/pages/server/environment-repository.adoc index a4b63d04fc..fb134f261a 100644 --- a/docs/modules/ROOT/pages/server/environment-repository.adoc +++ b/docs/modules/ROOT/pages/server/environment-repository.adoc @@ -35,6 +35,17 @@ If there are profile-specific YAML (or properties) files, these are also applied Higher precedence translates to a `PropertySource` listed earlier in the `Environment`. (These same rules apply in a standalone Spring Boot application.) +For the sample client above, a native, Git or SVN repository lists the following files of one search location in this order, from the highest precedence to the lowest: + +. `foo-mysql.yml` +. `application-mysql.yml` +. `foo-dev.yml` +. `application-dev.yml` +. `foo.yml` +. `application.yml` + +The server loads the shared `application` files as well as the files named after the application, so a file such as `foo-dev.yml` applies only to the `foo` application and can hold settings that one application needs for one profile. + You can set `spring.cloud.config.server.accept-empty` to `false` so that Server would return a HTTP 404 status, if the application is not found. By default, this flag is set to `true`. NOTE: You cannot place `spring.main.*` properties in a remote `EnvironmentRepository`. These properties are used as part of the application initialization. diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/NativeEnvironmentRepositoryTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/NativeEnvironmentRepositoryTests.java index 57d024cefe..d592abad96 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/NativeEnvironmentRepositoryTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/NativeEnvironmentRepositoryTests.java @@ -39,6 +39,7 @@ * @author Spencer Gibb * @author Venil Noronha * @author Daniel Lavoie + * @author Sharang Gupta */ public class NativeEnvironmentRepositoryTests { @@ -71,6 +72,20 @@ public void vanilla() { assertThat(environment.getVersion()).as("version was wrong").isEqualTo("myversion"); } + @Test + public void applicationAndProfileSpecificFilesFollowSpringBootPrecedence() { + this.repository.setSearchLocations("classpath:/test/precedence/"); + + Environment environment = this.repository.findOne("orders", "dev,mysql", null); + + assertThat(environment.getPropertySources()).extracting(PropertySource::getName) + .containsExactly("classpath:/test/precedence/orders-mysql.yml", + "classpath:/test/precedence/application-mysql.yml", "classpath:/test/precedence/orders-dev.yml", + "classpath:/test/precedence/application-dev.yml", "classpath:/test/precedence/orders.yml", + "classpath:/test/precedence/application.yml"); + assertThat(environment.getPropertySources().get(0).getSource().get("source")).isEqualTo("orders-mysql.yml"); + } + @Test public void ignoresExistingProfile() { System.setProperty("spring.profiles.active", "cloud"); diff --git a/spring-cloud-config-server/src/test/resources/test/precedence/application-dev.yml b/spring-cloud-config-server/src/test/resources/test/precedence/application-dev.yml new file mode 100644 index 0000000000..8e6a740e3d --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/test/precedence/application-dev.yml @@ -0,0 +1 @@ +source: application-dev.yml diff --git a/spring-cloud-config-server/src/test/resources/test/precedence/application-mysql.yml b/spring-cloud-config-server/src/test/resources/test/precedence/application-mysql.yml new file mode 100644 index 0000000000..061ec659a5 --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/test/precedence/application-mysql.yml @@ -0,0 +1 @@ +source: application-mysql.yml diff --git a/spring-cloud-config-server/src/test/resources/test/precedence/application.yml b/spring-cloud-config-server/src/test/resources/test/precedence/application.yml new file mode 100644 index 0000000000..b4bb44581a --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/test/precedence/application.yml @@ -0,0 +1 @@ +source: application.yml diff --git a/spring-cloud-config-server/src/test/resources/test/precedence/orders-dev.yml b/spring-cloud-config-server/src/test/resources/test/precedence/orders-dev.yml new file mode 100644 index 0000000000..d0b57d2302 --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/test/precedence/orders-dev.yml @@ -0,0 +1 @@ +source: orders-dev.yml diff --git a/spring-cloud-config-server/src/test/resources/test/precedence/orders-mysql.yml b/spring-cloud-config-server/src/test/resources/test/precedence/orders-mysql.yml new file mode 100644 index 0000000000..0766018f2f --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/test/precedence/orders-mysql.yml @@ -0,0 +1 @@ +source: orders-mysql.yml diff --git a/spring-cloud-config-server/src/test/resources/test/precedence/orders.yml b/spring-cloud-config-server/src/test/resources/test/precedence/orders.yml new file mode 100644 index 0000000000..5fa1ff7186 --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/test/precedence/orders.yml @@ -0,0 +1 @@ +source: orders.yml