Skip to content

Commit 93a2651

Browse files
committed
Make sure method injection handles ambiguous signatures
This commit updates InjectionGenerator to request a resolved attribute with a dedicated type if multiple methods with the same name and the same number of arguments exist. This was previously done already for constructors and this commit harmonizes the algorithms to methods as well Closes gh-28154
1 parent f3181dc commit 93a2651

File tree

3 files changed

+15
-5
lines changed

3 files changed

+15
-5
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/generator/InjectionGenerator.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,10 @@ private CodeBlock generateMethodInvocation(Method injectionPoint, Consumer<Build
199199
code.add(")\n").indent().indent();
200200
}
201201
attributesResolver.accept(code);
202-
List<CodeBlock> parameters = resolveParameters(injectionPoint.getParameters(), false);
202+
Parameter[] methodParameters = injectionPoint.getParameters();
203+
boolean isAmbiguous = Arrays.stream(injectionPoint.getDeclaringClass().getDeclaredMethods())
204+
.filter(method -> method.getName().equals(injectionPoint.getName()) && method.getParameterCount() == methodParameters.length).count() > 1;
205+
List<CodeBlock> parameters = resolveParameters(methodParameters, isAmbiguous);
203206
code.add(" ");
204207
if (instantiation) {
205208
if (Modifier.isStatic(injectionPoint.getModifiers())) {

spring-beans/src/test/java/org/springframework/beans/factory/generator/BeanDefinitionsContributionTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ void contributeGeneratesBeanDefinitionsInOrder() {
8686
CodeSnippet code = contribute(beanFactory, createGenerationContext());
8787
assertThat(code.getSnippet()).isEqualTo("""
8888
BeanDefinitionRegistrar.of("counter", Integer.class).withFactoryMethod(Integer.class, "valueOf", int.class)
89-
.instanceSupplier((instanceContext) -> instanceContext.create(beanFactory, (attributes) -> Integer.valueOf(attributes.get(0)))).customize((bd) -> bd.getConstructorArgumentValues().addIndexedArgumentValue(0, 42)).register(beanFactory);
89+
.instanceSupplier((instanceContext) -> instanceContext.create(beanFactory, (attributes) -> Integer.valueOf(attributes.get(0, int.class)))).customize((bd) -> bd.getConstructorArgumentValues().addIndexedArgumentValue(0, 42)).register(beanFactory);
9090
BeanDefinitionRegistrar.of("name", String.class).withConstructor(String.class)
9191
.instanceSupplier((instanceContext) -> instanceContext.create(beanFactory, (attributes) -> new String(attributes.get(0, String.class)))).customize((bd) -> bd.getConstructorArgumentValues().addIndexedArgumentValue(0, "Hello")).register(beanFactory);
9292
""");

spring-beans/src/test/java/org/springframework/beans/factory/generator/InjectionGeneratorTests.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.springframework.aot.generator.ProtectedAccess.Options;
2929
import org.springframework.beans.factory.ObjectProvider;
3030
import org.springframework.beans.factory.generator.InjectionGeneratorTests.SimpleConstructorBean.InnerClass;
31+
import org.springframework.beans.testfixture.beans.factory.generator.factory.SampleFactory;
3132
import org.springframework.javapoet.support.CodeSnippet;
3233
import org.springframework.util.ReflectionUtils;
3334

@@ -105,8 +106,14 @@ void generateInstantiationForStaticMethodWithNonGenericParameter() {
105106

106107
@Test
107108
void generateInstantiationForMethodWithGenericParameters() {
108-
assertThat(generateInstantiation(method(SampleBean.class, "source", ObjectProvider.class)).lines()).containsExactly(
109-
"instanceContext.create(beanFactory, (attributes) -> beanFactory.getBean(InjectionGeneratorTests.SampleBean.class).source(attributes.get(0)))");
109+
assertThat(generateInstantiation(method(SampleBean.class, "sourceWithProvider", ObjectProvider.class)).lines()).containsExactly(
110+
"instanceContext.create(beanFactory, (attributes) -> beanFactory.getBean(InjectionGeneratorTests.SampleBean.class).sourceWithProvider(attributes.get(0)))");
111+
}
112+
113+
@Test
114+
void generateInstantiationForAmbiguousMethod() {
115+
assertThat(generateInstantiation(method(SampleFactory.class, "create", String.class)).lines()).containsExactly(
116+
"instanceContext.create(beanFactory, (attributes) -> SampleFactory.create(attributes.get(0, String.class)))");
110117
}
111118

112119
@Test
@@ -263,7 +270,7 @@ String source(Integer counter) {
263270
return "source" + counter;
264271
}
265272

266-
String source(ObjectProvider<Integer> counter) {
273+
String sourceWithProvider(ObjectProvider<Integer> counter) {
267274
return "source" + counter.getIfAvailable(() -> 0);
268275
}
269276

0 commit comments

Comments
 (0)