Skip to content

Commit 98ed90d

Browse files
committed
Merge pull request #39376 from ronaldmik
* gh-39376: Polish "Derive driverClassName from URL when otherwise unknown" Derive driverClassName from URL when otherwise unknown Closes gh-39376
2 parents 82706ac + a12bfd9 commit 98ed90d

File tree

2 files changed

+50
-6
lines changed

2 files changed

+50
-6
lines changed

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/DataSourceBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,8 @@ public T build() {
186186
}
187187
if (!applied.contains(DataSourceProperty.DRIVER_CLASS_NAME)
188188
&& properties.canSet(DataSourceProperty.DRIVER_CLASS_NAME)
189-
&& this.values.containsKey(DataSourceProperty.URL)) {
190-
String url = this.values.get(DataSourceProperty.URL);
189+
&& applied.contains(DataSourceProperty.URL)) {
190+
String url = properties.get(dataSource, DataSourceProperty.URL);
191191
DatabaseDriver driver = DatabaseDriver.fromJdbcUrl(url);
192192
properties.set(dataSource, DataSourceProperty.DRIVER_CLASS_NAME, driver.getDriverClassName());
193193
}

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/DataSourceBuilderTests.java

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -457,6 +457,36 @@ void buildWhenDerivedFromCustomTypeWithTypeChange() {
457457
assertThat(testSource.getPassword()).isEqualTo("secret");
458458
}
459459

460+
@Test
461+
void buildWhenDerivedFromCustomTypeDeriveDriverClassNameFromUrl() {
462+
NoDriverClassNameDataSource dataSource = new NoDriverClassNameDataSource();
463+
dataSource.setUsername("test");
464+
dataSource.setPassword("secret");
465+
dataSource.setUrl("jdbc:postgresql://localhost:5432/postgres");
466+
DataSourceBuilder<?> builder = DataSourceBuilder.derivedFrom(dataSource).type(SimpleDriverDataSource.class);
467+
SimpleDriverDataSource testSource = (SimpleDriverDataSource) builder.build();
468+
assertThat(testSource.getUsername()).isEqualTo("test");
469+
assertThat(testSource.getUrl()).isEqualTo("jdbc:postgresql://localhost:5432/postgres");
470+
assertThat(testSource.getPassword()).isEqualTo("secret");
471+
assertThat(testSource.getDriver()).isInstanceOf(org.postgresql.Driver.class);
472+
}
473+
474+
@Test
475+
void buildWhenDerivedFromCustomTypeDeriveDriverClassNameFromOverridenUrl() {
476+
NoDriverClassNameDataSource dataSource = new NoDriverClassNameDataSource();
477+
dataSource.setUsername("test");
478+
dataSource.setPassword("secret");
479+
dataSource.setUrl("jdbc:mysql://localhost:5432/mysql");
480+
DataSourceBuilder<?> builder = DataSourceBuilder.derivedFrom(dataSource)
481+
.type(SimpleDriverDataSource.class)
482+
.url("jdbc:mariadb://localhost:5432/mariadb");
483+
SimpleDriverDataSource testSource = (SimpleDriverDataSource) builder.build();
484+
assertThat(testSource.getUsername()).isEqualTo("test");
485+
assertThat(testSource.getUrl()).isEqualTo("jdbc:mariadb://localhost:5432/mariadb");
486+
assertThat(testSource.getPassword()).isEqualTo("secret");
487+
assertThat(testSource.getDriver()).isInstanceOf(org.mariadb.jdbc.Driver.class);
488+
}
489+
460490
@Test // gh-31920
461491
void buildWhenC3P0TypeSpecifiedReturnsExpectedDataSource() {
462492
this.dataSource = DataSourceBuilder.create()
@@ -620,12 +650,10 @@ void setPassword(String password) {
620650

621651
}
622652

623-
static class CustomDataSource extends LimitedCustomDataSource {
653+
static class NoDriverClassNameDataSource extends LimitedCustomDataSource {
624654

625655
private String url;
626656

627-
private String driverClassName;
628-
629657
String getUrl() {
630658
return this.url;
631659
}
@@ -634,6 +662,14 @@ void setUrl(String url) {
634662
this.url = url;
635663
}
636664

665+
}
666+
667+
static class CustomDataSource extends LimitedCustomDataSource {
668+
669+
private String driverClassName;
670+
671+
private String url;
672+
637673
String getDriverClassName() {
638674
return this.driverClassName;
639675
}
@@ -642,6 +678,14 @@ void setDriverClassName(String driverClassName) {
642678
this.driverClassName = driverClassName;
643679
}
644680

681+
String getUrl() {
682+
return this.url;
683+
}
684+
685+
void setUrl(String url) {
686+
this.url = url;
687+
}
688+
645689
}
646690

647691
}

0 commit comments

Comments
 (0)