Merge pull request #47300 from xyraclius
Build and Deploy Snapshot / Build and Deploy Snapshot (push) Waiting to run Details
Build and Deploy Snapshot / Trigger Docs Build (push) Blocked by required conditions Details
Build and Deploy Snapshot / Verify (push) Blocked by required conditions Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:17], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:17], map[id:windows-latest name:Windows]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:21], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:21], map[id:windows-latest name:Windows]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:24], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:24], map[id:windows-latest name:Windows]) (push) Waiting to run Details
Run CodeQL Analysis / run-analysis (push) Waiting to run Details
Run System Tests / Java ${{ matrix.java.version}} (map[toolchain:false version:17]) (push) Waiting to run Details
Run System Tests / Java ${{ matrix.java.version}} (map[toolchain:true version:21]) (push) Waiting to run Details

* pr/47300:
  Polish "Use liquibase schema in LiquibaseEndpoint if it set"
  Use liquibase schema in LiquibaseEndpoint if it set

Closes gh-47300
This commit is contained in:
Stéphane Nicoll 2025-09-29 10:22:00 +02:00
commit e8b6ab14bc
2 changed files with 56 additions and 32 deletions

View File

@ -43,6 +43,7 @@ import org.springframework.util.StringUtils;
* {@link Endpoint @Endpoint} to expose liquibase info. * {@link Endpoint @Endpoint} to expose liquibase info.
* *
* @author Eddú Meléndez * @author Eddú Meléndez
* @author Nabil Fawwaz Elqayyim
* @since 2.0.0 * @since 2.0.0
*/ */
@Endpoint(id = "liquibase") @Endpoint(id = "liquibase")
@ -79,9 +80,10 @@ public class LiquibaseEndpoint {
Database database = null; Database database = null;
try { try {
database = factory.findCorrectDatabaseImplementation(connection); database = factory.findCorrectDatabaseImplementation(connection);
String defaultSchema = liquibase.getDefaultSchema(); String schemaToUse = StringUtils.hasText(liquibase.getLiquibaseSchema())
if (StringUtils.hasText(defaultSchema)) { ? liquibase.getLiquibaseSchema() : liquibase.getDefaultSchema();
database.setDefaultSchemaName(defaultSchema); if (StringUtils.hasText(schemaToUse)) {
database.setDefaultSchemaName(schemaToUse);
} }
database.setDatabaseChangeLogTableName(liquibase.getDatabaseChangeLogTable()); database.setDatabaseChangeLogTableName(liquibase.getDatabaseChangeLogTable());
database.setDatabaseChangeLogLockTableName(liquibase.getDatabaseChangeLogLockTable()); database.setDatabaseChangeLogLockTableName(liquibase.getDatabaseChangeLogLockTable());

View File

@ -18,7 +18,7 @@ package org.springframework.boot.actuate.liquibase;
import java.sql.Connection; import java.sql.Connection;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.Arrays; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID; 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.EmbeddedDatabaseConnection;
import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer; import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer;
import org.springframework.boot.sql.init.DatabaseInitializationSettings; 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.ApplicationContextRunner;
import org.springframework.boot.test.context.runner.ContextConsumer;
import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.boot.testsupport.classpath.resources.WithResource;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
@ -65,14 +67,7 @@ class LiquibaseEndpointTests {
@Test @Test
void liquibaseReportIsReturned() { void liquibaseReportIsReturned() {
this.contextRunner.withUserConfiguration(Config.class).run((context) -> { this.contextRunner.withUserConfiguration(Config.class).run(hasEndpointWithInitializedSchema());
Map<String, LiquibaseBeanDescriptor> liquibaseBeans = context.getBean(LiquibaseEndpoint.class)
.liquibaseBeans()
.getContexts()
.get(context.getId())
.getLiquibaseBeans();
assertThat(liquibaseBeans.get("liquibase").getChangeSets()).hasSize(1);
});
} }
@Test @Test
@ -90,18 +85,41 @@ class LiquibaseEndpointTests {
} }
@Test @Test
@WithResource(name = "db/create-custom-schema.sql", content = "CREATE SCHEMA CUSTOMSCHEMA;") @WithResource(name = "db/create-custom-schema.sql", content = "CREATE SCHEMA ANOTHER_SCHEMA;")
void invokeWithCustomSchema() { void invokeWithCustomDefaultSchemaFailsIfItDoesNotExist() {
this.contextRunner.withUserConfiguration(Config.class, DataSourceWithSchemaConfiguration.class) this.contextRunner.withUserConfiguration(Config.class, DataSourceWithSchemaConfiguration.class)
.withPropertyValues("spring.liquibase.default-schema=CUSTOMSCHEMA") .withPropertyValues("spring.liquibase.default-schema=CUSTOM_DEFAULT_SCHEMA")
.run((context) -> { .run((context) -> assertThat(context).hasFailed()
Map<String, LiquibaseBeanDescriptor> liquibaseBeans = context.getBean(LiquibaseEndpoint.class) .getFailure()
.liquibaseBeans() .rootCause()
.getContexts() .hasMessageContaining("CUSTOM_DEFAULT_SCHEMA"));
.get(context.getId()) }
.getLiquibaseBeans();
assertThat(liquibaseBeans.get("liquibase").getChangeSets()).hasSize(1); @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 @Test
@ -109,14 +127,18 @@ class LiquibaseEndpointTests {
this.contextRunner.withUserConfiguration(Config.class) this.contextRunner.withUserConfiguration(Config.class)
.withPropertyValues("spring.liquibase.database-change-log-lock-table=liquibase_database_changelog_lock", .withPropertyValues("spring.liquibase.database-change-log-lock-table=liquibase_database_changelog_lock",
"spring.liquibase.database-change-log-table=liquibase_database_changelog") "spring.liquibase.database-change-log-table=liquibase_database_changelog")
.run((context) -> { .run(hasEndpointWithInitializedSchema());
}
private ContextConsumer<AssertableApplicationContext> hasEndpointWithInitializedSchema() {
return (context) -> {
Map<String, LiquibaseBeanDescriptor> liquibaseBeans = context.getBean(LiquibaseEndpoint.class) Map<String, LiquibaseBeanDescriptor> liquibaseBeans = context.getBean(LiquibaseEndpoint.class)
.liquibaseBeans() .liquibaseBeans()
.getContexts() .getContexts()
.get(context.getId()) .get(context.getId())
.getLiquibaseBeans(); .getLiquibaseBeans();
assertThat(liquibaseBeans.get("liquibase").getChangeSets()).hasSize(1); assertThat(liquibaseBeans.get("liquibase").getChangeSets()).hasSize(1);
}); };
} }
@Test @Test
@ -179,7 +201,7 @@ class LiquibaseEndpointTests {
.setName(UUID.randomUUID().toString()) .setName(UUID.randomUUID().toString())
.build(); .build();
DatabaseInitializationSettings settings = new DatabaseInitializationSettings(); 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, DataSourceScriptDatabaseInitializer initializer = new DataSourceScriptDatabaseInitializer(dataSource,
settings); settings);
initializer.initializeDatabase(); initializer.initializeDatabase();