From 4611230d695dbaaf0ab8dab56c1ae167fbc6f152 Mon Sep 17 00:00:00 2001 From: Ronald Mik Date: Thu, 1 Feb 2024 20:29:15 +0100 Subject: [PATCH 1/2] Derive driverClassName from URL when otherwise unknown See gh-39376 --- .../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 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; } From a12bfd9ec3c3d948d8f97bf3ab1a1402105d637c Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 22 Jul 2024 09:42:28 +0100 Subject: [PATCH 2/2] Polish "Derive driverClassName from URL when otherwise unknown" See gh-39376 --- .../boot/jdbc/DataSourceBuilderTests.java | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) 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 38353207bc8..87778a9e5a3 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 @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -458,8 +458,8 @@ class DataSourceBuilderTests { } @Test - void buildWhenDerivedFromCustomTypeDeriveDriverClassNameFromDerivedUrl() { - UrlCapableLimitedCustomDataSource dataSource = new UrlCapableLimitedCustomDataSource(); + void buildWhenDerivedFromCustomTypeDeriveDriverClassNameFromUrl() { + NoDriverClassNameDataSource dataSource = new NoDriverClassNameDataSource(); dataSource.setUsername("test"); dataSource.setPassword("secret"); dataSource.setUrl("jdbc:postgresql://localhost:5432/postgres"); @@ -471,6 +471,22 @@ class DataSourceBuilderTests { assertThat(testSource.getDriver()).isInstanceOf(org.postgresql.Driver.class); } + @Test + void buildWhenDerivedFromCustomTypeDeriveDriverClassNameFromOverridenUrl() { + NoDriverClassNameDataSource dataSource = new NoDriverClassNameDataSource(); + dataSource.setUsername("test"); + dataSource.setPassword("secret"); + dataSource.setUrl("jdbc:mysql://localhost:5432/mysql"); + DataSourceBuilder builder = DataSourceBuilder.derivedFrom(dataSource) + .type(SimpleDriverDataSource.class) + .url("jdbc:mariadb://localhost:5432/mariadb"); + SimpleDriverDataSource testSource = (SimpleDriverDataSource) builder.build(); + assertThat(testSource.getUsername()).isEqualTo("test"); + assertThat(testSource.getUrl()).isEqualTo("jdbc:mariadb://localhost:5432/mariadb"); + assertThat(testSource.getPassword()).isEqualTo("secret"); + assertThat(testSource.getDriver()).isInstanceOf(org.mariadb.jdbc.Driver.class); + } + @Test // gh-31920 void buildWhenC3P0TypeSpecifiedReturnsExpectedDataSource() { this.dataSource = DataSourceBuilder.create() @@ -634,7 +650,7 @@ class DataSourceBuilderTests { } - static class UrlCapableLimitedCustomDataSource extends LimitedCustomDataSource { + static class NoDriverClassNameDataSource extends LimitedCustomDataSource { private String url; @@ -648,10 +664,11 @@ class DataSourceBuilderTests { } - static class CustomDataSource extends UrlCapableLimitedCustomDataSource { + static class CustomDataSource extends LimitedCustomDataSource { private String driverClassName; + private String url; String getDriverClassName() { return this.driverClassName; @@ -661,6 +678,14 @@ class DataSourceBuilderTests { this.driverClassName = driverClassName; } + String getUrl() { + return this.url; + } + + void setUrl(String url) { + this.url = url; + } + } }