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 7d6fdc4fb3f..84b90532231 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 @@ -176,8 +176,10 @@ public final class DataSourceBuilder { for (DataSourceProperty property : DataSourceProperty.values()) { if (this.values.containsKey(property)) { String value = this.values.get(property); - properties.set(dataSource, property, value); - applied.add(property); + if (value != null) { + properties.set(dataSource, property, value); + applied.add(property); + } } else if (deriveFromProperties != null && properties.canSet(property)) { String value = deriveFromProperties.get(this.deriveFrom, property); 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 c995a58713b..468ddd2e421 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 @@ -73,6 +73,14 @@ class DataSourceBuilderTests { assertThat(hikariDataSource.getJdbcUrl()).isEqualTo("jdbc:h2:test"); } + @Test // gh-26633 + void buildWhenHikariDataSourceWithNullPasswordReturnsHikariDataSource() { + this.dataSource = DataSourceBuilder.create().url("jdbc:h2:test").username("test").password(null).build(); + assertThat(this.dataSource).isInstanceOf(HikariDataSource.class); + HikariDataSource hikariDataSource = (HikariDataSource) this.dataSource; + assertThat(hikariDataSource.getJdbcUrl()).isEqualTo("jdbc:h2:test"); + } + @Test void buildWhenHikariNotAvailableReturnsTomcatDataSource() { this.dataSource = DataSourceBuilder.create(new HidePackagesClassLoader("com.zaxxer.hikari")).url("jdbc:h2:test") @@ -80,6 +88,13 @@ class DataSourceBuilderTests { assertThat(this.dataSource).isInstanceOf(org.apache.tomcat.jdbc.pool.DataSource.class); } + @Test // gh-26633 + void buildWhenTomcatDataSourceWithNullPasswordReturnsDataSource() { + this.dataSource = DataSourceBuilder.create(new HidePackagesClassLoader("com.zaxxer.hikari")).url("jdbc:h2:test") + .username("test").password(null).build(); + assertThat(this.dataSource).isInstanceOf(org.apache.tomcat.jdbc.pool.DataSource.class); + } + @Test void buildWhenHikariAndTomcatNotAvailableReturnsDbcp2DataSource() { this.dataSource = DataSourceBuilder @@ -88,6 +103,14 @@ class DataSourceBuilderTests { assertThat(this.dataSource).isInstanceOf(BasicDataSource.class); } + @Test // gh-26633 + void buildWhenDbcp2DataSourceWithNullPasswordReturnsDbcp2DataSource() { + this.dataSource = DataSourceBuilder + .create(new HidePackagesClassLoader("com.zaxxer.hikari", "org.apache.tomcat.jdbc.pool")) + .url("jdbc:h2:test").username("test").password(null).build(); + assertThat(this.dataSource).isInstanceOf(BasicDataSource.class); + } + @Test void buildWhenHikariAndTomcatAndDbcpNotAvailableReturnsOracleUcpDataSource() { this.dataSource = DataSourceBuilder.create(new HidePackagesClassLoader("com.zaxxer.hikari",