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..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. @@ -457,6 +457,36 @@ class DataSourceBuilderTests { assertThat(testSource.getPassword()).isEqualTo("secret"); } + @Test + void buildWhenDerivedFromCustomTypeDeriveDriverClassNameFromUrl() { + NoDriverClassNameDataSource dataSource = new NoDriverClassNameDataSource(); + 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 + 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() @@ -620,12 +650,10 @@ class DataSourceBuilderTests { } - static class CustomDataSource extends LimitedCustomDataSource { + static class NoDriverClassNameDataSource extends LimitedCustomDataSource { private String url; - private String driverClassName; - String getUrl() { return this.url; } @@ -634,6 +662,14 @@ class DataSourceBuilderTests { this.url = url; } + } + + static class CustomDataSource extends LimitedCustomDataSource { + + private String driverClassName; + + private String url; + String getDriverClassName() { return this.driverClassName; } @@ -642,6 +678,14 @@ class DataSourceBuilderTests { this.driverClassName = driverClassName; } + String getUrl() { + return this.url; + } + + void setUrl(String url) { + this.url = url; + } + } }