Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
thomas-ross-aws opened this issue Jan 29, 2025 · 4 comments · Fixed by #46140
Labels
area/spring Issues relating to the Spring integration kind/bug Something isn't working
Milestone

Comments

@thomas-ross-aws
Copy link

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.

@thomas-ross-aws thomas-ross-aws added the kind/bug Something isn't working label Jan 29, 2025
@quarkus-bot quarkus-bot bot added the area/spring Issues relating to the Spring integration label Jan 29, 2025
Copy link

quarkus-bot bot commented Jan 29, 2025

/cc @aureamunoz (spring), @geoand (spring)

@geoand
Copy link
Contributor

geoand commented Jan 30, 2025

Thanks for reporting @thomas-ross-aws!

As you have already analyzed the code, would you like to provide a PR (ideally with a test)?

@mcruzdev
Copy link
Contributor

mcruzdev commented Feb 3, 2025

@thomas-ross-aws If you can't send this pull request, I'm available to try

@thomas-ross-aws
Copy link
Author

@mcruzdev feel free to go ahead!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/spring Issues relating to the Spring integration kind/bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants