diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/service/connection/ConnectionDetailsFactories.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/service/connection/ConnectionDetailsFactories.java index d93146eb82c..441590f7dce 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/service/connection/ConnectionDetailsFactories.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/service/connection/ConnectionDetailsFactories.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 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. @@ -122,13 +122,30 @@ public class ConnectionDetailsFactories { @SuppressWarnings("unchecked") private static Registration get(ConnectionDetailsFactory factory) { ResolvableType type = ResolvableType.forClass(ConnectionDetailsFactory.class, factory.getClass()); - if (!type.hasUnresolvableGenerics()) { - Class[] generics = type.resolveGenerics(); + Class[] generics = resolveGenerics(type); + if (generics != null) { return new Registration<>((Class) generics[0], (Class) generics[1], factory); } return null; } + /** + * Resolve the generics of the given {@link ResolvableType} or {@code null} if any + * of them cannot be resolved. + * @param type the type to inspect + * @return the resolved generics if they can be loaded from the classpath, + * {@code null} otherwise + */ + private static Class[] resolveGenerics(ResolvableType type) { + Class[] resolvedGenerics = type.resolveGenerics(); + for (Class genericRawType : resolvedGenerics) { + if (genericRawType == null) { + return null; + } + } + return resolvedGenerics; + } + } }