diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/DataSourceBuilder.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/DataSourceBuilder.java index 816a6a8a372..cea962a7fa7 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/DataSourceBuilder.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/DataSourceBuilder.java @@ -186,8 +186,8 @@ public final class DataSourceBuilder { } if (!applied.contains(DataSourceProperty.DRIVER_CLASS_NAME) && properties.canSet(DataSourceProperty.DRIVER_CLASS_NAME) - && this.values.containsKey(DataSourceProperty.URL)) { - String url = this.values.get(DataSourceProperty.URL); + && applied.contains(DataSourceProperty.URL)) { + String url = properties.get(dataSource, DataSourceProperty.URL); DatabaseDriver driver = DatabaseDriver.fromJdbcUrl(url); properties.set(dataSource, DataSourceProperty.DRIVER_CLASS_NAME, driver.getDriverClassName()); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/DataSourceBuilderTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/DataSourceBuilderTests.java index 216f22d5b10..38353207bc8 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/DataSourceBuilderTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/DataSourceBuilderTests.java @@ -457,6 +457,20 @@ class DataSourceBuilderTests { assertThat(testSource.getPassword()).isEqualTo("secret"); } + @Test + void buildWhenDerivedFromCustomTypeDeriveDriverClassNameFromDerivedUrl() { + UrlCapableLimitedCustomDataSource dataSource = new UrlCapableLimitedCustomDataSource(); + dataSource.setUsername("test"); + dataSource.setPassword("secret"); + dataSource.setUrl("jdbc:postgresql://localhost:5432/postgres"); + DataSourceBuilder builder = DataSourceBuilder.derivedFrom(dataSource).type(SimpleDriverDataSource.class); + SimpleDriverDataSource testSource = (SimpleDriverDataSource) builder.build(); + assertThat(testSource.getUsername()).isEqualTo("test"); + assertThat(testSource.getUrl()).isEqualTo("jdbc:postgresql://localhost:5432/postgres"); + assertThat(testSource.getPassword()).isEqualTo("secret"); + assertThat(testSource.getDriver()).isInstanceOf(org.postgresql.Driver.class); + } + @Test // gh-31920 void buildWhenC3P0TypeSpecifiedReturnsExpectedDataSource() { this.dataSource = DataSourceBuilder.create() @@ -620,12 +634,10 @@ class DataSourceBuilderTests { } - static class CustomDataSource extends LimitedCustomDataSource { + static class UrlCapableLimitedCustomDataSource extends LimitedCustomDataSource { private String url; - private String driverClassName; - String getUrl() { return this.url; } @@ -634,6 +646,13 @@ class DataSourceBuilderTests { this.url = url; } + } + + static class CustomDataSource extends UrlCapableLimitedCustomDataSource { + + private String driverClassName; + + String getDriverClassName() { return this.driverClassName; }