Browse Source

Search implemented interfaces on superclass for @ServiceConnection

Refine original fix to also search interfaces on the superclass.

Fixes gh-37671
pull/38706/head
Phillip Webb 2 years ago committed by Andy Wilkinson
parent
commit
fcb75b6a1e
  1. 6
      spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/ServiceConnectionContextCustomizerFactory.java
  2. 12
      spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/ServiceConnectionContextCustomizerFactoryTests.java

6
spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/ServiceConnectionContextCustomizerFactory.java

@ -54,7 +54,10 @@ class ServiceConnectionContextCustomizerFactory implements ContextCustomizerFact @@ -54,7 +54,10 @@ class ServiceConnectionContextCustomizerFactory implements ContextCustomizerFact
}
private void findSources(Class<?> clazz, List<ContainerConnectionSource<?>> sources) {
ReflectionUtils.doWithFields(clazz, (field) -> {
if (clazz == Object.class || clazz == null) {
return;
}
ReflectionUtils.doWithLocalFields(clazz, (field) -> {
MergedAnnotations annotations = MergedAnnotations.from(field);
annotations.stream(ServiceConnection.class)
.forEach((annotation) -> sources.add(createSource(field, annotation)));
@ -65,6 +68,7 @@ class ServiceConnectionContextCustomizerFactory implements ContextCustomizerFact @@ -65,6 +68,7 @@ class ServiceConnectionContextCustomizerFactory implements ContextCustomizerFact
for (Class<?> implementedInterface : clazz.getInterfaces()) {
findSources(implementedInterface, sources);
}
findSources(clazz.getSuperclass(), sources);
}
@SuppressWarnings("unchecked")

12
spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/ServiceConnectionContextCustomizerFactoryTests.java

@ -94,6 +94,14 @@ class ServiceConnectionContextCustomizerFactoryTests { @@ -94,6 +94,14 @@ class ServiceConnectionContextCustomizerFactoryTests {
assertThat(customizer.getSources()).hasSize(2);
}
@Test
void createContextCustomizerWhenInheritedImplementedInterfaceHasServiceConnectionsReturnsCustomizer() {
ServiceConnectionContextCustomizer customizer = (ServiceConnectionContextCustomizer) this.factory
.createContextCustomizer(ServiceConnectionsImplSubclass.class, null);
assertThat(customizer).isNotNull();
assertThat(customizer.getSources()).hasSize(2);
}
@Test
void createContextCustomizerWhenClassHasNonStaticServiceConnectionFailsWithHelpfulException() {
assertThatIllegalStateException()
@ -186,6 +194,10 @@ class ServiceConnectionContextCustomizerFactoryTests { @@ -186,6 +194,10 @@ class ServiceConnectionContextCustomizerFactoryTests {
}
static class ServiceConnectionsImplSubclass extends ServiceConnectionsImpl {
}
static class NonStaticServiceConnection {
@ServiceConnection

Loading…
Cancel
Save