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 80333d0f45..2e2bc97d00 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 @@ -24,9 +24,13 @@ import java.util.Map; import java.util.Objects; import java.util.stream.Stream; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import org.springframework.core.ResolvableType; import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.io.support.SpringFactoriesLoader; +import org.springframework.core.io.support.SpringFactoriesLoader.FailureHandler; import org.springframework.util.Assert; /** @@ -39,6 +43,8 @@ import org.springframework.util.Assert; */ public class ConnectionDetailsFactories { + private static final Log logger = LogFactory.getLog(ConnectionDetailsFactories.class); + private List> registrations = new ArrayList<>(); public ConnectionDetailsFactories() { @@ -47,7 +53,8 @@ public class ConnectionDetailsFactories { @SuppressWarnings({ "rawtypes", "unchecked" }) ConnectionDetailsFactories(SpringFactoriesLoader loader) { - List factories = loader.load(ConnectionDetailsFactory.class); + List factories = loader.load(ConnectionDetailsFactory.class, + FailureHandler.logging(logger)); Stream> registrations = factories.stream().map(Registration::get); registrations.filter(Objects::nonNull).forEach(this.registrations::add); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/service/connection/ConnectionDetailsFactoriesTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/service/connection/ConnectionDetailsFactoriesTests.java index 785f7707d0..68c8bf6b09 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/service/connection/ConnectionDetailsFactoriesTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/service/connection/ConnectionDetailsFactoriesTests.java @@ -28,6 +28,7 @@ import org.springframework.core.test.io.support.MockSpringFactoriesLoader; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; +import static org.assertj.core.api.Assertions.assertThatNoException; /** * Tests for {@link ConnectionDetailsFactories}. @@ -87,6 +88,12 @@ class ConnectionDetailsFactoriesTests { assertThat(registrations.get(2).factory()).isEqualTo(orderThree); } + @Test + void factoryLoadFailureDoesNotPreventOtherFactoriesFromLoading() { + this.loader.add(ConnectionDetailsFactory.class.getName(), "com.example.NonExistentConnectionDetailsFactory"); + assertThatNoException().isThrownBy(() -> new ConnectionDetailsFactories(this.loader)); + } + private static final class TestConnectionDetailsFactory implements ConnectionDetailsFactory, Ordered {