-
Notifications
You must be signed in to change notification settings - Fork 3k
Description
Describe the bug
If you have a Spring configuration class with a producer for a named bean:
package quarkus.playground;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfiguration {
@Bean("mySpecialName")
public String foo() {
return "foo";
}
}
The Quarkus SpringDIProcessor will add @Named("foo") (the method name) instead of @Named("mySpecialName") (the bean name), and we will get an UnsatisfiedResolutionException.
This should work properly, getBeanNameFromBeanInstance in SpringDIProcessor does check the value of the @Bean annotation to place the correct @Named annotation on the method, but it has a small error: this if statement checks if beanNameAnnotationValue != null instead of if beanValueAnnotationValue != null (beanName vs beanValue).
Expected behavior
The correct name should be applied to the producer (e.g. mySpecialName, not foo).
Actual behavior
We get a unsatisfied dependency error:
2025-01-29 19:34:29,353 ERROR [io.qua.dep.dev.IsolatedDevModeMain] (main) Failed to start quarkus: java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: jakarta.enterprise.inject.spi.DeploymentException: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type java.lang.String and qualifiers [@Named("mySpecialName")]
- injection target: parameter 'foo' of quarkus.playground.GreetingResource constructor
- declared on CLASS bean [types=[quarkus.playground.GreetingResource, java.lang.Object], qualifiers=[@Default, @Any], target=quarkus.playground.GreetingResource]
The following beans match by type, but none has matching qualifiers:
- PRODUCER METHOD bean [types=[java.io.Serializable, java.lang.String, java.lang.CharSequence, java.lang.constant.ConstantDesc, java.lang.Object, java.lang.constant.Constable, java.lang.Comparable<java.lang.String>], qualifiers=[@Any, @ConfigProperty], target=java.lang.String produceStringConfigProperty(jakarta.enterprise.inject.spi.InjectionPoint ip), declaringBean=io.smallrye.config.inject.ConfigProducer]
- PRODUCER METHOD bean [types=[java.io.Serializable, java.lang.String, java.lang.CharSequence, java.lang.constant.ConstantDesc, java.lang.Object, java.lang.constant.Constable, java.lang.Comparable<java.lang.String>], qualifiers=[@Default, @Any, @Named("foo")], target=java.lang.String foo(), declaringBean=quarkus.playground.MyConfiguration]
at io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:1576)
at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:338)
at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:178)
at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:492)
at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:733)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:856)
at io.quarkus.builder.BuildContext.run(BuildContext.java:256)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2675)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2654)
at org.jboss.threads.EnhancedQueueExecutor.runThreadBody(EnhancedQueueExecutor.java:1627)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1594)
at java.base/java.lang.Thread.run(Thread.java:1583)
at org.jboss.threads.JBossThread.run(JBossThread.java:499)
Caused by: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type java.lang.String and qualifiers [@Named("mySpecialName")]
- injection target: parameter 'foo' of quarkus.playground.GreetingResource constructor
- declared on CLASS bean [types=[quarkus.playground.GreetingResource, java.lang.Object], qualifiers=[@Default, @Any], target=quarkus.playground.GreetingResource]
The following beans match by type, but none has matching qualifiers:
- PRODUCER METHOD bean [types=[java.io.Serializable, java.lang.String, java.lang.CharSequence, java.lang.constant.ConstantDesc, java.lang.Object, java.lang.constant.Constable, java.lang.Comparable<java.lang.String>], qualifiers=[@Any, @ConfigProperty], target=java.lang.String produceStringConfigProperty(jakarta.enterprise.inject.spi.InjectionPoint ip), declaringBean=io.smallrye.config.inject.ConfigProducer]
- PRODUCER METHOD bean [types=[java.io.Serializable, java.lang.String, java.lang.CharSequence, java.lang.constant.ConstantDesc, java.lang.Object, java.lang.constant.Constable, java.lang.Comparable<java.lang.String>], qualifiers=[@Default, @Any, @Named("foo")], target=java.lang.String foo(), declaringBean=quarkus.playground.MyConfiguration]
at io.quarkus.arc.processor.Beans.resolveInjectionPoint(Beans.java:547)
at io.quarkus.arc.processor.BeanInfo.init(BeanInfo.java:697)
at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:323)
... 12 more
at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:355)
at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:272)
at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:62)
at io.quarkus.deployment.dev.IsolatedDevModeMain.firstStart(IsolatedDevModeMain.java:89)
at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:428)
at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:55)
at io.quarkus.bootstrap.app.CuratedApplication.runInCl(CuratedApplication.java:138)
at io.quarkus.bootstrap.app.CuratedApplication.runInAugmentClassLoader(CuratedApplication.java:93)
at io.quarkus.deployment.dev.DevModeMain.start(DevModeMain.java:131)
at io.quarkus.deployment.dev.DevModeMain.main(DevModeMain.java:62)
Caused by: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: jakarta.enterprise.inject.spi.DeploymentException: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type java.lang.String and qualifiers [@Named("mySpecialName")]
- injection target: parameter 'foo' of quarkus.playground.GreetingResource constructor
- declared on CLASS bean [types=[quarkus.playground.GreetingResource, java.lang.Object], qualifiers=[@Default, @Any], target=quarkus.playground.GreetingResource]
The following beans match by type, but none has matching qualifiers:
- PRODUCER METHOD bean [types=[java.io.Serializable, java.lang.String, java.lang.CharSequence, java.lang.constant.ConstantDesc, java.lang.Object, java.lang.constant.Constable, java.lang.Comparable<java.lang.String>], qualifiers=[@Any, @ConfigProperty], target=java.lang.String produceStringConfigProperty(jakarta.enterprise.inject.spi.InjectionPoint ip), declaringBean=io.smallrye.config.inject.ConfigProducer]
- PRODUCER METHOD bean [types=[java.io.Serializable, java.lang.String, java.lang.CharSequence, java.lang.constant.ConstantDesc, java.lang.Object, java.lang.constant.Constable, java.lang.Comparable<java.lang.String>], qualifiers=[@Default, @Any, @Named("foo")], target=java.lang.String foo(), declaringBean=quarkus.playground.MyConfiguration]
at io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:1576)
at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:338)
at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:178)
at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:492)
at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:733)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:856)
at io.quarkus.builder.BuildContext.run(BuildContext.java:256)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2675)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2654)
at org.jboss.threads.EnhancedQueueExecutor.runThreadBody(EnhancedQueueExecutor.java:1627)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1594)
at java.base/java.lang.Thread.run(Thread.java:1583)
at org.jboss.threads.JBossThread.run(JBossThread.java:499)
Caused by: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type java.lang.String and qualifiers [@Named("mySpecialName")]
- injection target: parameter 'foo' of quarkus.playground.GreetingResource constructor
- declared on CLASS bean [types=[quarkus.playground.GreetingResource, java.lang.Object], qualifiers=[@Default, @Any], target=quarkus.playground.GreetingResource]
The following beans match by type, but none has matching qualifiers:
- PRODUCER METHOD bean [types=[java.io.Serializable, java.lang.String, java.lang.CharSequence, java.lang.constant.ConstantDesc, java.lang.Object, java.lang.constant.Constable, java.lang.Comparable<java.lang.String>], qualifiers=[@Any, @ConfigProperty], target=java.lang.String produceStringConfigProperty(jakarta.enterprise.inject.spi.InjectionPoint ip), declaringBean=io.smallrye.config.inject.ConfigProducer]
- PRODUCER METHOD bean [types=[java.io.Serializable, java.lang.String, java.lang.CharSequence, java.lang.constant.ConstantDesc, java.lang.Object, java.lang.constant.Constable, java.lang.Comparable<java.lang.String>], qualifiers=[@Default, @Any, @Named("foo")], target=java.lang.String foo(), declaringBean=quarkus.playground.MyConfiguration]
at io.quarkus.arc.processor.Beans.resolveInjectionPoint(Beans.java:547)
at io.quarkus.arc.processor.BeanInfo.init(BeanInfo.java:697)
at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:323)
... 12 more
at io.quarkus.builder.Execution.run(Execution.java:124)
at io.quarkus.builder.BuildExecutionBuilder.execute(BuildExecutionBuilder.java:79)
at io.quarkus.deployment.QuarkusAugmentor.run(QuarkusAugmentor.java:161)
at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:351)
... 9 more
Caused by: jakarta.enterprise.inject.spi.DeploymentException: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type java.lang.String and qualifiers [@Named("mySpecialName")]
- injection target: parameter 'foo' of quarkus.playground.GreetingResource constructor
- declared on CLASS bean [types=[quarkus.playground.GreetingResource, java.lang.Object], qualifiers=[@Default, @Any], target=quarkus.playground.GreetingResource]
The following beans match by type, but none has matching qualifiers:
- PRODUCER METHOD bean [types=[java.io.Serializable, java.lang.String, java.lang.CharSequence, java.lang.constant.ConstantDesc, java.lang.Object, java.lang.constant.Constable, java.lang.Comparable<java.lang.String>], qualifiers=[@Any, @ConfigProperty], target=java.lang.String produceStringConfigProperty(jakarta.enterprise.inject.spi.InjectionPoint ip), declaringBean=io.smallrye.config.inject.ConfigProducer]
- PRODUCER METHOD bean [types=[java.io.Serializable, java.lang.String, java.lang.CharSequence, java.lang.constant.ConstantDesc, java.lang.Object, java.lang.constant.Constable, java.lang.Comparable<java.lang.String>], qualifiers=[@Default, @Any, @Named("foo")], target=java.lang.String foo(), declaringBean=quarkus.playground.MyConfiguration]
at io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:1576)
at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:338)
at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:178)
at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:492)
at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:733)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:856)
at io.quarkus.builder.BuildContext.run(BuildContext.java:256)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2675)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2654)
at org.jboss.threads.EnhancedQueueExecutor.runThreadBody(EnhancedQueueExecutor.java:1627)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1594)
at java.base/java.lang.Thread.run(Thread.java:1583)
at org.jboss.threads.JBossThread.run(JBossThread.java:499)
Caused by: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type java.lang.String and qualifiers [@Named("mySpecialName")]
- injection target: parameter 'foo' of quarkus.playground.GreetingResource constructor
- declared on CLASS bean [types=[quarkus.playground.GreetingResource, java.lang.Object], qualifiers=[@Default, @Any], target=quarkus.playground.GreetingResource]
The following beans match by type, but none has matching qualifiers:
- PRODUCER METHOD bean [types=[java.io.Serializable, java.lang.String, java.lang.CharSequence, java.lang.constant.ConstantDesc, java.lang.Object, java.lang.constant.Constable, java.lang.Comparable<java.lang.String>], qualifiers=[@Any, @ConfigProperty], target=java.lang.String produceStringConfigProperty(jakarta.enterprise.inject.spi.InjectionPoint ip), declaringBean=io.smallrye.config.inject.ConfigProducer]
- PRODUCER METHOD bean [types=[java.io.Serializable, java.lang.String, java.lang.CharSequence, java.lang.constant.ConstantDesc, java.lang.Object, java.lang.constant.Constable, java.lang.Comparable<java.lang.String>], qualifiers=[@Default, @Any, @Named("foo")], target=java.lang.String foo(), declaringBean=quarkus.playground.MyConfiguration]
at io.quarkus.arc.processor.Beans.resolveInjectionPoint(Beans.java:547)
at io.quarkus.arc.processor.BeanInfo.init(BeanInfo.java:697)
at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:323)
... 12 more
How to Reproduce?
- Download and extract quarkus-spring-bean-named-repro.tar.gz
gradle quarkusDevor similar- Observe the dependency error
Output of uname -a or ver
No response
Output of java -version
No response
Quarkus version or git rev
No response
Build tool (ie. output of mvnw --version or gradlew --version)
No response
Additional information
A workaround for this issue is to use @Bean(name="mySpecialName") instead of @Bean("mySpecialName"), which are functionally equivalent in Spring, and the first is not affected by the bug.