From c8b049867353bb6dbfc26265c27f020073744db7 Mon Sep 17 00:00:00 2001 From: Ronald Mik Date: Thu, 1 Feb 2024 20:29:15 +0100 Subject: [PATCH] Make DataSourceBuilder be able to derive driverClassName from derived url from provided Datasource --- .../boot/jdbc/DataSourceBuilder.java | 4 +-- .../boot/jdbc/DataSourceBuilderTests.java | 25 ++++++++++++++++--- 2 files changed, 24 insertions(+), 5 deletions(-) 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 816a6a8a372f..cea962a7fa74 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 T build() { } 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 216f22d5b10c..38353207bc85 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 @@ void buildWhenDerivedFromCustomTypeWithTypeChange() { 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 @@ void setPassword(String password) { } - 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 @@ void setUrl(String url) { this.url = url; } + } + + static class CustomDataSource extends UrlCapableLimitedCustomDataSource { + + private String driverClassName; + + String getDriverClassName() { return this.driverClassName; }