Skip to content

Commit cbc0378

Browse files
committed
Allow startup to contiune when ConnectionDetailsFactory load fails
Prior to this commit, a failure to load a ConnectionDetailsFactory caused startup to fail. This causes problems when some of a factory's required classes were not available, for examle when using spring-boot-docker-compose without Actuator. Fixes gh-35100
1 parent ff36f52 commit cbc0378

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/service/connection/ConnectionDetailsFactories.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,13 @@
2424
import java.util.Objects;
2525
import java.util.stream.Stream;
2626

27+
import org.apache.commons.logging.Log;
28+
import org.apache.commons.logging.LogFactory;
29+
2730
import org.springframework.core.ResolvableType;
2831
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
2932
import org.springframework.core.io.support.SpringFactoriesLoader;
33+
import org.springframework.core.io.support.SpringFactoriesLoader.FailureHandler;
3034
import org.springframework.util.Assert;
3135

3236
/**
@@ -39,6 +43,8 @@
3943
*/
4044
public class ConnectionDetailsFactories {
4145

46+
private static final Log logger = LogFactory.getLog(ConnectionDetailsFactories.class);
47+
4248
private List<Registration<?, ?>> registrations = new ArrayList<>();
4349

4450
public ConnectionDetailsFactories() {
@@ -47,7 +53,8 @@ public ConnectionDetailsFactories() {
4753

4854
@SuppressWarnings({ "rawtypes", "unchecked" })
4955
ConnectionDetailsFactories(SpringFactoriesLoader loader) {
50-
List<ConnectionDetailsFactory> factories = loader.load(ConnectionDetailsFactory.class);
56+
List<ConnectionDetailsFactory> factories = loader.load(ConnectionDetailsFactory.class,
57+
FailureHandler.logging(logger));
5158
Stream<Registration<?, ?>> registrations = factories.stream().map(Registration::get);
5259
registrations.filter(Objects::nonNull).forEach(this.registrations::add);
5360
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/service/connection/ConnectionDetailsFactoriesTests.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import static org.assertj.core.api.Assertions.assertThat;
2929
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
3030
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
31+
import static org.assertj.core.api.Assertions.assertThatNoException;
3132

3233
/**
3334
* Tests for {@link ConnectionDetailsFactories}.
@@ -87,6 +88,12 @@ void getRegistrationsReturnsOrderedDelegates() {
8788
assertThat(registrations.get(2).factory()).isEqualTo(orderThree);
8889
}
8990

91+
@Test
92+
void factoryLoadFailureDoesNotPreventOtherFactoriesFromLoading() {
93+
this.loader.add(ConnectionDetailsFactory.class.getName(), "com.example.NonExistentConnectionDetailsFactory");
94+
assertThatNoException().isThrownBy(() -> new ConnectionDetailsFactories(this.loader));
95+
}
96+
9097
private static final class TestConnectionDetailsFactory
9198
implements ConnectionDetailsFactory<String, TestConnectionDetails>, Ordered {
9299

0 commit comments

Comments
 (0)