Skip to content

Commit d3c8829

Browse files
committed
Polish 'Include @bean method annotations in ContainerConnectionSource'
See gh-50033
1 parent fe5424b commit d3c8829

2 files changed

Lines changed: 27 additions & 34 deletions

File tree

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

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,25 @@
1616

1717
package org.springframework.boot.testcontainers.service.connection;
1818

19-
import java.lang.reflect.Method;
2019
import java.util.LinkedHashSet;
2120
import java.util.Set;
2221

2322
import org.testcontainers.containers.Container;
2423

2524
import org.springframework.beans.factory.BeanFactory;
2625
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
26+
import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
2727
import org.springframework.beans.factory.config.BeanDefinition;
2828
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
2929
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
30-
import org.springframework.beans.factory.support.RootBeanDefinition;
3130
import org.springframework.boot.autoconfigure.service.connection.ConnectionDetailsFactories;
3231
import org.springframework.boot.origin.Origin;
3332
import org.springframework.boot.testcontainers.beans.TestcontainerBeanDefinition;
3433
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
3534
import org.springframework.core.annotation.MergedAnnotation;
3635
import org.springframework.core.annotation.MergedAnnotations;
3736
import org.springframework.core.type.AnnotationMetadata;
37+
import org.springframework.core.type.MethodMetadata;
3838

3939
/**
4040
* {@link ImportBeanDefinitionRegistrar} used by
@@ -63,8 +63,7 @@ private void registerBeanDefinitions(ConfigurableListableBeanFactory beanFactory
6363
new ConnectionDetailsFactories(null));
6464
for (String beanName : beanFactory.getBeanNamesForType(Container.class)) {
6565
BeanDefinition beanDefinition = getBeanDefinition(beanFactory, beanName);
66-
MergedAnnotations annotations = (beanDefinition instanceof TestcontainerBeanDefinition testcontainerBeanDefinition)
67-
? testcontainerBeanDefinition.getAnnotations() : getAnnotationsFromFactoryMethod(beanDefinition);
66+
MergedAnnotations annotations = getAnnotations(beanDefinition);
6867
for (ServiceConnection serviceConnection : getServiceConnections(beanFactory, beanName, annotations)) {
6968
ContainerConnectionSource<?> source = createSource(beanFactory, beanName, beanDefinition, annotations,
7069
serviceConnection);
@@ -73,16 +72,6 @@ private void registerBeanDefinitions(ConfigurableListableBeanFactory beanFactory
7372
}
7473
}
7574

76-
private MergedAnnotations getAnnotationsFromFactoryMethod(BeanDefinition beanDefinition) {
77-
if (beanDefinition instanceof RootBeanDefinition rootBeanDefinition) {
78-
Method factoryMethod = rootBeanDefinition.getResolvedFactoryMethod();
79-
if (factoryMethod != null) {
80-
return MergedAnnotations.from(factoryMethod, MergedAnnotations.SearchStrategy.DIRECT);
81-
}
82-
}
83-
return null;
84-
}
85-
8675
private Set<ServiceConnection> getServiceConnections(ConfigurableListableBeanFactory beanFactory, String beanName,
8776
MergedAnnotations annotations) {
8877
Set<ServiceConnection> serviceConnections = beanFactory.findAllAnnotationsOnBean(beanName,
@@ -105,6 +94,17 @@ private BeanDefinition getBeanDefinition(ConfigurableListableBeanFactory beanFac
10594
}
10695
}
10796

97+
private MergedAnnotations getAnnotations(BeanDefinition beanDefinition) {
98+
if (beanDefinition instanceof TestcontainerBeanDefinition testcontainerBeanDefinition) {
99+
return testcontainerBeanDefinition.getAnnotations();
100+
}
101+
if (beanDefinition instanceof AnnotatedBeanDefinition annotatedBeanDefinition) {
102+
MethodMetadata metadata = annotatedBeanDefinition.getFactoryMethodMetadata();
103+
return (metadata != null) ? metadata.getAnnotations() : null;
104+
}
105+
return null;
106+
}
107+
108108
@SuppressWarnings("unchecked")
109109
private <C extends Container<?>> ContainerConnectionSource<C> createSource(
110110
ConfigurableListableBeanFactory beanFactory, String beanName, BeanDefinition beanDefinition,

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

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,39 +19,32 @@
1919
import org.junit.jupiter.api.Test;
2020
import org.testcontainers.containers.PostgreSQLContainer;
2121

22-
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
22+
import org.springframework.boot.autoconfigure.AutoConfigurations;
23+
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2324
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactory.ContainerConnectionDetails;
24-
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
2525
import org.springframework.context.annotation.Bean;
2626
import org.springframework.context.annotation.Configuration;
2727

2828
import static org.assertj.core.api.Assertions.assertThat;
2929
import static org.mockito.Mockito.mock;
3030

3131
/**
32-
* Tests for {@link ServiceConnectionAutoConfigurationRegistrar} to verify that
33-
* annotations on {@link Bean @Bean} methods are available in
34-
* {@link ContainerConnectionSource}.
32+
* Tests for {@link ServiceConnectionAutoConfigurationRegistrar}.
3533
*
3634
* @author Daeho Kwon
3735
*/
3836
class ServiceConnectionAutoConfigurationRegistrarTests {
3937

4038
@Test
4139
void sslAnnotationOnBeanMethodShouldBeDetectedInContainerConnectionSource() {
42-
try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext()) {
43-
context.register(WithServiceConnectionAutoConfiguration.class, ContainerConfiguration.class);
44-
context.refresh();
45-
ContainerConnectionDetails<?> details = (ContainerConnectionDetails<?>) context
46-
.getBean(DatabaseConnectionDetails.class);
47-
assertThat(details.hasAnnotation(Ssl.class)).isTrue();
48-
}
49-
}
50-
51-
@Configuration(proxyBeanMethods = false)
52-
@ImportAutoConfiguration(ServiceConnectionAutoConfiguration.class)
53-
static class WithServiceConnectionAutoConfiguration {
54-
40+
new ApplicationContextRunner()
41+
.withConfiguration(AutoConfigurations.of(ServiceConnectionAutoConfiguration.class))
42+
.withUserConfiguration(ContainerConfiguration.class)
43+
.run((context) -> {
44+
ContainerConnectionDetails<?> connectionDetails = (ContainerConnectionDetails<?>) context
45+
.getBean(DatabaseConnectionDetails.class);
46+
assertThat(connectionDetails.hasAnnotation(Ssl.class)).isTrue();
47+
});
5548
}
5649

5750
@Configuration(proxyBeanMethods = false)
@@ -60,8 +53,8 @@ static class ContainerConfiguration {
6053
@Bean
6154
@ServiceConnection
6255
@Ssl
63-
PostgreSQLContainer container() {
64-
return mock(PostgreSQLContainer.class);
56+
PostgreSQLContainer<?> container() {
57+
return mock();
6558
}
6659

6760
}

0 commit comments

Comments
 (0)