You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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 SpringDIProcessordoes 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
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.
The text was updated successfully, but these errors were encountered:
Describe the bug
If you have a Spring configuration class with a producer for a named bean:
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
inSpringDIProcessor
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 ifbeanNameAnnotationValue != null
instead of ifbeanValueAnnotationValue != null
(beanName vs beanValue).Expected behavior
The correct name should be applied to the producer (e.g.
mySpecialName
, notfoo
).Actual behavior
We get a unsatisfied dependency error:
How to Reproduce?
gradle quarkusDev
or similarOutput of
uname -a
orver
No response
Output of
java -version
No response
Quarkus version or git rev
No response
Build tool (ie. output of
mvnw --version
orgradlew --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.The text was updated successfully, but these errors were encountered: