diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/metadata/DataSourcePoolMetadataProvidersConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/metadata/DataSourcePoolMetadataProvidersConfiguration.java index 063c2ac6c9e..1e8538b6b55 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/metadata/DataSourcePoolMetadataProvidersConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/metadata/DataSourcePoolMetadataProvidersConfiguration.java @@ -24,6 +24,8 @@ import org.apache.commons.dbcp2.BasicDataSource; import org.apache.commons.dbcp2.BasicDataSourceMXBean; import org.apache.tomcat.jdbc.pool.jmx.ConnectionPoolMBean; +import org.springframework.aot.hint.RuntimeHints; +import org.springframework.aot.hint.RuntimeHintsRegistrar; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.jdbc.DataSourceUnwrapper; import org.springframework.boot.jdbc.metadata.CommonsDbcp2DataSourcePoolMetadata; @@ -33,6 +35,7 @@ import org.springframework.boot.jdbc.metadata.OracleUcpDataSourcePoolMetadata; import org.springframework.boot.jdbc.metadata.TomcatDataSourcePoolMetadata; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.ImportRuntimeHints; /** * Register the {@link DataSourcePoolMetadataProvider} instances for the supported data @@ -65,6 +68,7 @@ public class DataSourcePoolMetadataProvidersConfiguration { @Configuration(proxyBeanMethods = false) @ConditionalOnClass(HikariDataSource.class) + @ImportRuntimeHints(HikariDataSourcePoolMetadataRuntimeHints.class) static class HikariPoolDataSourceMetadataProviderConfiguration { @Bean @@ -116,4 +120,13 @@ public class DataSourcePoolMetadataProvidersConfiguration { } + static class HikariDataSourcePoolMetadataRuntimeHints implements RuntimeHintsRegistrar { + + @Override + public void registerHints(RuntimeHints hints, ClassLoader classLoader) { + hints.reflection().registerType(HikariDataSource.class, (builder) -> builder.withField("pool")); + } + + } + } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/metadata/HikariDataSourcePoolMetadataRuntimeHintsTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/metadata/HikariDataSourcePoolMetadataRuntimeHintsTests.java new file mode 100644 index 00000000000..5f02c63d9fb --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/metadata/HikariDataSourcePoolMetadataRuntimeHintsTests.java @@ -0,0 +1,57 @@ +/* + * Copyright 2012-present 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.jdbc.metadata; + +import java.util.Optional; + +import com.zaxxer.hikari.HikariDataSource; +import org.junit.jupiter.api.Test; + +import org.springframework.aot.hint.RuntimeHints; +import org.springframework.aot.hint.predicate.RuntimeHintsPredicates; +import org.springframework.boot.autoconfigure.jdbc.metadata.DataSourcePoolMetadataProvidersConfiguration.HikariDataSourcePoolMetadataRuntimeHints; +import org.springframework.boot.autoconfigure.jdbc.metadata.DataSourcePoolMetadataProvidersConfiguration.HikariPoolDataSourceMetadataProviderConfiguration; +import org.springframework.context.annotation.ImportRuntimeHints; +import org.springframework.core.annotation.MergedAnnotations; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link HikariDataSourcePoolMetadataRuntimeHints}. + * + * @author Andy Wilkinson + */ +class HikariDataSourcePoolMetadataRuntimeHintsTests { + + @Test + @SuppressWarnings("rawtypes") + void importsRegistrar() { + Optional imported = MergedAnnotations.from(HikariPoolDataSourceMetadataProviderConfiguration.class) + .get(ImportRuntimeHints.class) + .getValue("value", Class[].class); + assertThat(imported).hasValue(new Class[] { HikariDataSourcePoolMetadataRuntimeHints.class }); + } + + @Test + void registersHints() { + RuntimeHints runtimeHints = new RuntimeHints(); + new HikariDataSourcePoolMetadataRuntimeHints().registerHints(runtimeHints, getClass().getClassLoader()); + assertThat(HikariDataSource.class).hasDeclaredFields("pool"); + assertThat(RuntimeHintsPredicates.reflection().onField(HikariDataSource.class, "pool")).accepts(runtimeHints); + } + +}