From bdb05639bcf6d0c0d0dc2febf1ea706e4688635c Mon Sep 17 00:00:00 2001 From: Nabil Fawwaz Elqayyim Date: Tue, 23 Sep 2025 07:03:06 +0700 Subject: [PATCH 1/2] Use liquibase schema in LiquibaseEndpoint if it set See gh-47300 Signed-off-by: Nabil Fawwaz Elqayyim --- .../actuate/liquibase/LiquibaseEndpoint.java | 10 +++++++--- .../liquibase/LiquibaseEndpointTests.java | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/liquibase/LiquibaseEndpoint.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/liquibase/LiquibaseEndpoint.java index ffabc2104dd..5e780e7652a 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/liquibase/LiquibaseEndpoint.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/liquibase/LiquibaseEndpoint.java @@ -43,6 +43,7 @@ import org.springframework.util.StringUtils; * {@link Endpoint @Endpoint} to expose liquibase info. * * @author EddĂș MelĂ©ndez + * @author Nabil Fawwaz Elqayyim * @since 2.0.0 */ @Endpoint(id = "liquibase") @@ -79,9 +80,12 @@ public class LiquibaseEndpoint { Database database = null; try { database = factory.findCorrectDatabaseImplementation(connection); - String defaultSchema = liquibase.getDefaultSchema(); - if (StringUtils.hasText(defaultSchema)) { - database.setDefaultSchemaName(defaultSchema); + String schemaToUse = liquibase.getLiquibaseSchema(); + if (!StringUtils.hasText(schemaToUse)) { // Use liquibase-schema if set, otherwise fall back to default-schema + schemaToUse = liquibase.getDefaultSchema(); + } + if (StringUtils.hasText(schemaToUse)) { + database.setDefaultSchemaName(schemaToUse); } database.setDatabaseChangeLogTableName(liquibase.getDatabaseChangeLogTable()); database.setDatabaseChangeLogLockTableName(liquibase.getDatabaseChangeLogLockTable()); diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/liquibase/LiquibaseEndpointTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/liquibase/LiquibaseEndpointTests.java index 8c04745f124..fb1718d206a 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/liquibase/LiquibaseEndpointTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/liquibase/LiquibaseEndpointTests.java @@ -50,6 +50,7 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Andy Wilkinson * @author Stephane Nicoll * @author Leo Li + * @author Nabil Fawwaz Elqayyim */ @WithResource(name = "db/changelog/db.changelog-master.yaml", content = """ databaseChangeLog: @@ -119,6 +120,21 @@ class LiquibaseEndpointTests { }); } + @Test + @WithResource(name = "db/create-custom-schema.sql", content = "CREATE SCHEMA LIQUIBASE_SCHEMA;") + void invokeWithLiquibaseSchema() { + this.contextRunner.withUserConfiguration(Config.class, DataSourceWithSchemaConfiguration.class) + .withPropertyValues("spring.liquibase.liquibase-schema=LIQUIBASE_SCHEMA") + .run((context) -> { + Map liquibaseBeans = context.getBean(LiquibaseEndpoint.class) + .liquibaseBeans() + .getContexts() + .get(context.getId()) + .getLiquibaseBeans(); + assertThat(liquibaseBeans.get("liquibase").getChangeSets()).hasSize(1); + }); + } + @Test void connectionAutoCommitPropertyIsReset() { this.contextRunner.withUserConfiguration(Config.class).run((context) -> { From 5344fb218a9d3e94b8056fe0b93d82ec21fa8ddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Mon, 29 Sep 2025 10:16:16 +0200 Subject: [PATCH 2/2] Polish "Use liquibase schema in LiquibaseEndpoint if it set" See gh-47300 --- .../actuate/liquibase/LiquibaseEndpoint.java | 6 +- .../liquibase/LiquibaseEndpointTests.java | 92 ++++++++++--------- 2 files changed, 51 insertions(+), 47 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/liquibase/LiquibaseEndpoint.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/liquibase/LiquibaseEndpoint.java index 5e780e7652a..54679040dd1 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/liquibase/LiquibaseEndpoint.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/liquibase/LiquibaseEndpoint.java @@ -80,10 +80,8 @@ public class LiquibaseEndpoint { Database database = null; try { database = factory.findCorrectDatabaseImplementation(connection); - String schemaToUse = liquibase.getLiquibaseSchema(); - if (!StringUtils.hasText(schemaToUse)) { // Use liquibase-schema if set, otherwise fall back to default-schema - schemaToUse = liquibase.getDefaultSchema(); - } + String schemaToUse = StringUtils.hasText(liquibase.getLiquibaseSchema()) + ? liquibase.getLiquibaseSchema() : liquibase.getDefaultSchema(); if (StringUtils.hasText(schemaToUse)) { database.setDefaultSchemaName(schemaToUse); } diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/liquibase/LiquibaseEndpointTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/liquibase/LiquibaseEndpointTests.java index fb1718d206a..8d412812a0a 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/liquibase/LiquibaseEndpointTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/liquibase/LiquibaseEndpointTests.java @@ -18,7 +18,7 @@ package org.springframework.boot.actuate.liquibase; import java.sql.Connection; import java.sql.SQLException; -import java.util.Arrays; +import java.util.List; import java.util.Map; import java.util.UUID; @@ -34,7 +34,9 @@ import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfigurati import org.springframework.boot.jdbc.EmbeddedDatabaseConnection; import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer; import org.springframework.boot.sql.init.DatabaseInitializationSettings; +import org.springframework.boot.test.context.assertj.AssertableApplicationContext; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.boot.test.context.runner.ContextConsumer; import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; @@ -50,7 +52,6 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Andy Wilkinson * @author Stephane Nicoll * @author Leo Li - * @author Nabil Fawwaz Elqayyim */ @WithResource(name = "db/changelog/db.changelog-master.yaml", content = """ databaseChangeLog: @@ -66,14 +67,7 @@ class LiquibaseEndpointTests { @Test void liquibaseReportIsReturned() { - this.contextRunner.withUserConfiguration(Config.class).run((context) -> { - Map liquibaseBeans = context.getBean(LiquibaseEndpoint.class) - .liquibaseBeans() - .getContexts() - .get(context.getId()) - .getLiquibaseBeans(); - assertThat(liquibaseBeans.get("liquibase").getChangeSets()).hasSize(1); - }); + this.contextRunner.withUserConfiguration(Config.class).run(hasEndpointWithInitializedSchema()); } @Test @@ -91,18 +85,41 @@ class LiquibaseEndpointTests { } @Test - @WithResource(name = "db/create-custom-schema.sql", content = "CREATE SCHEMA CUSTOMSCHEMA;") - void invokeWithCustomSchema() { + @WithResource(name = "db/create-custom-schema.sql", content = "CREATE SCHEMA ANOTHER_SCHEMA;") + void invokeWithCustomDefaultSchemaFailsIfItDoesNotExist() { this.contextRunner.withUserConfiguration(Config.class, DataSourceWithSchemaConfiguration.class) - .withPropertyValues("spring.liquibase.default-schema=CUSTOMSCHEMA") - .run((context) -> { - Map liquibaseBeans = context.getBean(LiquibaseEndpoint.class) - .liquibaseBeans() - .getContexts() - .get(context.getId()) - .getLiquibaseBeans(); - assertThat(liquibaseBeans.get("liquibase").getChangeSets()).hasSize(1); - }); + .withPropertyValues("spring.liquibase.default-schema=CUSTOM_DEFAULT_SCHEMA") + .run((context) -> assertThat(context).hasFailed() + .getFailure() + .rootCause() + .hasMessageContaining("CUSTOM_DEFAULT_SCHEMA")); + } + + @Test + @WithResource(name = "db/create-custom-schema.sql", content = "CREATE SCHEMA CUSTOM_SCHEMA;") + void invokeWithCustomDefaultSchema() { + this.contextRunner.withUserConfiguration(Config.class, DataSourceWithSchemaConfiguration.class) + .withPropertyValues("spring.liquibase.default-schema=CUSTOM_SCHEMA") + .run(hasEndpointWithInitializedSchema()); + } + + @Test + @WithResource(name = "db/create-custom-schema.sql", content = "CREATE SCHEMA ANOTHER_SCHEMA;") + void invokeWithLiquibaseSchemaFailsIfItDoesNotExist() { + this.contextRunner.withUserConfiguration(Config.class, DataSourceWithSchemaConfiguration.class) + .withPropertyValues("spring.liquibase.liquibase-schema=CUSTOM_LIQUIBASE_SCHEMA") + .run((context) -> assertThat(context).hasFailed() + .getFailure() + .rootCause() + .hasMessageContaining("CUSTOM_LIQUIBASE_SCHEMA")); + } + + @Test + @WithResource(name = "db/create-custom-schema.sql", content = "CREATE SCHEMA LIQUIBASE_SCHEMA;") + void invokeWithLiquibaseSchema() { + this.contextRunner.withUserConfiguration(Config.class, DataSourceWithSchemaConfiguration.class) + .withPropertyValues("spring.liquibase.liquibase-schema=LIQUIBASE_SCHEMA") + .run(hasEndpointWithInitializedSchema()); } @Test @@ -110,29 +127,18 @@ class LiquibaseEndpointTests { this.contextRunner.withUserConfiguration(Config.class) .withPropertyValues("spring.liquibase.database-change-log-lock-table=liquibase_database_changelog_lock", "spring.liquibase.database-change-log-table=liquibase_database_changelog") - .run((context) -> { - Map liquibaseBeans = context.getBean(LiquibaseEndpoint.class) - .liquibaseBeans() - .getContexts() - .get(context.getId()) - .getLiquibaseBeans(); - assertThat(liquibaseBeans.get("liquibase").getChangeSets()).hasSize(1); - }); + .run(hasEndpointWithInitializedSchema()); } - @Test - @WithResource(name = "db/create-custom-schema.sql", content = "CREATE SCHEMA LIQUIBASE_SCHEMA;") - void invokeWithLiquibaseSchema() { - this.contextRunner.withUserConfiguration(Config.class, DataSourceWithSchemaConfiguration.class) - .withPropertyValues("spring.liquibase.liquibase-schema=LIQUIBASE_SCHEMA") - .run((context) -> { - Map liquibaseBeans = context.getBean(LiquibaseEndpoint.class) - .liquibaseBeans() - .getContexts() - .get(context.getId()) - .getLiquibaseBeans(); - assertThat(liquibaseBeans.get("liquibase").getChangeSets()).hasSize(1); - }); + private ContextConsumer hasEndpointWithInitializedSchema() { + return (context) -> { + Map liquibaseBeans = context.getBean(LiquibaseEndpoint.class) + .liquibaseBeans() + .getContexts() + .get(context.getId()) + .getLiquibaseBeans(); + assertThat(liquibaseBeans.get("liquibase").getChangeSets()).hasSize(1); + }; } @Test @@ -195,7 +201,7 @@ class LiquibaseEndpointTests { .setName(UUID.randomUUID().toString()) .build(); DatabaseInitializationSettings settings = new DatabaseInitializationSettings(); - settings.setSchemaLocations(Arrays.asList("classpath:/db/create-custom-schema.sql")); + settings.setSchemaLocations(List.of("classpath:/db/create-custom-schema.sql")); DataSourceScriptDatabaseInitializer initializer = new DataSourceScriptDatabaseInitializer(dataSource, settings); initializer.initializeDatabase();