diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/DataSourceUnwrapper.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/DataSourceUnwrapper.java index 7ddd99b2a4..133a73181e 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/DataSourceUnwrapper.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/DataSourceUnwrapper.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -74,7 +74,7 @@ public final class DataSourceUnwrapper { private static S safeUnwrap(Wrapper wrapper, Class target) { try { - if (wrapper.isWrapperFor(target)) { + if (target.isInterface() && wrapper.isWrapperFor(target)) { return wrapper.unwrap(target); } } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/DataSourceUnwrapperTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/DataSourceUnwrapperTests.java index 75abb0b4f9..318a88c4aa 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/DataSourceUnwrapperTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/DataSourceUnwrapperTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -17,6 +17,7 @@ package org.springframework.boot.jdbc; import java.sql.SQLException; +import java.util.function.Consumer; import javax.sql.DataSource; @@ -87,12 +88,18 @@ class DataSourceUnwrapperTests { assertThat(DataSourceUnwrapper.unwrap(actual, DataSourceProxy.class)).isSameAs(dataSource); } + @Test + void unwrappingIsNotAttemptedWhenTargetIsNotAnInterface() throws SQLException { + DataSource dataSource = mock(DataSource.class); + assertThat(DataSourceUnwrapper.unwrap(dataSource, HikariDataSource.class)).isNull(); + verifyNoMoreInteractions(dataSource); + } + @Test void unwrappingIsNotAttemptedWhenDataSourceIsNotWrapperForTarget() throws SQLException { DataSource dataSource = mock(DataSource.class); - DataSource actual = DataSourceUnwrapper.unwrap(dataSource, HikariDataSource.class); - assertThat(actual).isNull(); - verify(dataSource).isWrapperFor(HikariDataSource.class); + assertThat(DataSourceUnwrapper.unwrap(dataSource, Consumer.class)).isNull(); + verify(dataSource).isWrapperFor(Consumer.class); verifyNoMoreInteractions(dataSource); }