Skip to content

Commit e9e911c

Browse files
committed
Detect annotations on @bean methods in ServiceConnectionAutoConfigurationRegistrar
Signed-off-by: Daeho Kwon <trewq231@naver.com>
1 parent 783dcb9 commit e9e911c

2 files changed

Lines changed: 84 additions & 1 deletion

File tree

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

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

19+
import java.lang.reflect.Method;
1920
import java.util.LinkedHashSet;
2021
import java.util.Set;
2122

@@ -27,6 +28,7 @@
2728
import org.springframework.beans.factory.config.BeanDefinition;
2829
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
2930
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
31+
import org.springframework.beans.factory.support.RootBeanDefinition;
3032
import org.springframework.boot.autoconfigure.service.connection.ConnectionDetailsFactories;
3133
import org.springframework.boot.origin.Origin;
3234
import org.springframework.boot.testcontainers.beans.TestcontainerBeanDefinition;
@@ -41,6 +43,7 @@
4143
* {@link ServiceConnectionAutoConfiguration}.
4244
*
4345
* @author Phillip Webb
46+
* @author Daeho Kwon
4447
*/
4548
class ServiceConnectionAutoConfigurationRegistrar implements ImportBeanDefinitionRegistrar {
4649

@@ -63,7 +66,8 @@ private void registerBeanDefinitions(ConfigurableListableBeanFactory beanFactory
6366
for (String beanName : beanFactory.getBeanNamesForType(Container.class)) {
6467
BeanDefinition beanDefinition = getBeanDefinition(beanFactory, beanName);
6568
MergedAnnotations annotations = (beanDefinition instanceof TestcontainerBeanDefinition testcontainerBeanDefinition)
66-
? testcontainerBeanDefinition.getAnnotations() : null;
69+
? testcontainerBeanDefinition.getAnnotations()
70+
: getAnnotationsFromFactoryMethod(beanDefinition);
6771
for (ServiceConnection serviceConnection : getServiceConnections(beanFactory, beanName, annotations)) {
6872
ContainerConnectionSource<?> source = createSource(beanFactory, beanName, beanDefinition, annotations,
6973
serviceConnection);
@@ -85,6 +89,16 @@ private Set<ServiceConnection> getServiceConnections(ConfigurableListableBeanFac
8589
return serviceConnections;
8690
}
8791

92+
private @Nullable MergedAnnotations getAnnotationsFromFactoryMethod(@Nullable BeanDefinition beanDefinition) {
93+
if (beanDefinition instanceof RootBeanDefinition rootBeanDefinition) {
94+
Method factoryMethod = rootBeanDefinition.getResolvedFactoryMethod();
95+
if (factoryMethod != null) {
96+
return MergedAnnotations.from(factoryMethod, MergedAnnotations.SearchStrategy.DIRECT);
97+
}
98+
}
99+
return null;
100+
}
101+
88102
private @Nullable BeanDefinition getBeanDefinition(ConfigurableListableBeanFactory beanFactory, String beanName) {
89103
try {
90104
return beanFactory.getBeanDefinition(beanName);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* Copyright 2012-present the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.testcontainers.service.connection;
18+
19+
import org.junit.jupiter.api.Test;
20+
import org.testcontainers.postgresql.PostgreSQLContainer;
21+
22+
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
23+
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactory.ContainerConnectionDetails;
24+
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
25+
import org.springframework.context.annotation.Bean;
26+
import org.springframework.context.annotation.Configuration;
27+
28+
import static org.assertj.core.api.Assertions.assertThat;
29+
import static org.mockito.Mockito.mock;
30+
31+
/**
32+
* Tests for {@link ServiceConnectionAutoConfigurationRegistrar} to verify that
33+
* annotations on {@link Bean @Bean} methods are available in
34+
* {@link ContainerConnectionSource}.
35+
*
36+
* @author Daeho Kwon
37+
*/
38+
class ServiceConnectionAutoConfigurationRegistrarTests {
39+
40+
@Test
41+
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+
55+
}
56+
57+
@Configuration(proxyBeanMethods = false)
58+
static class ContainerConfiguration {
59+
60+
@Bean
61+
@ServiceConnection
62+
@Ssl
63+
PostgreSQLContainer container() {
64+
return mock(PostgreSQLContainer.class);
65+
}
66+
67+
}
68+
69+
}

0 commit comments

Comments
 (0)