Skip to content

quarkus-spring-di: @Bean("foo") is not transformed into the proper @Named("foo") annotation #45961

@thomas-ross-aws

Description

@thomas-ross-aws

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?

  1. Download and extract quarkus-spring-bean-named-repro.tar.gz
  2. gradle quarkusDev or similar
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/springIssues relating to the Spring integrationkind/bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions