From c679b4ccd6a609500a5169dc794854b05748e921 Mon Sep 17 00:00:00 2001 From: Scott Frederick Date: Wed, 26 May 2021 13:04:35 -0700 Subject: [PATCH] Don't attempt to set null values Update `DataSourceBuilder` so that setters are not longer called for `null` values. This restores Spring Boot 2.4 behavior. Fixes gh-26633 Co-authored-by: Phillip Webb --- .../boot/jdbc/DataSourceBuilder.java | 6 +++-- .../boot/jdbc/DataSourceBuilderTests.java | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 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 7d6fdc4fb3f4..84b905322313 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 T build() { 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 c995a58713be..468ddd2e421b 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 @@ void buildWhenHikariAvailableReturnsHikariDataSource() { 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 @@ void buildWhenHikariNotAvailableReturnsTomcatDataSource() { 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 @@ void buildWhenHikariAndTomcatNotAvailableReturnsDbcp2DataSource() { 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",