Affects: Spring Boot 3.2.5, Spring 6.1.6. Also tested with Spring Boot 3.2.8
We have a project which we have some modules using javax/Guice and others with Spring Boot. Now we're upgrading from Spring Boot 2.7.18 to 3.2.5, but we're having some problems related to javax.inject.Named
.
Our code has a "common" module with services/repositories which is used in both Guice and Spring Boot, and for that we're using @Named/@Inject
in the classes.
In version 2.7.18 all is working fine, but when we upgraded to 3.2.5 we started receiving an error when injecting dependencies on a class. The class has 2 parameters in the constructor, both of an interface and using @Named("nameOfBean")
to distinguish between the expected implementation to be injected, and we have the two related implementations.
I created a simple project to reproduce the problem and share with you. I tried changing some dependencies and nothing solved the problem.
I tried changing all to jakarta.*
, and then all worked fine. But, that's not an option right now because of project context.
The project is in https://github.com/marcioscharamtrustly/TestSpringBootJavax
A lille more about the problem: It appears that Spring identifies @Named
and knows how to handle and inject it. But it doesn't work well when the parameters expect a @Named("name")
.
And we're based on this issue: https://github.com/spring-projects/spring-framework/issues/31090
The error I'm receiving when running TestSpringBootJavaxApplication
is:
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of constructor in any.javax.code.Service required a single bean, but 2 were found:
- ONE: defined in file [/Users/marcio.scharam/TestSpringBootJavax/javax-module/target/classes/any/javax/code/OneRepository.class]
- TWO: defined in file [/Users/marcio.scharam/TestSpringBootJavax/javax-module/target/classes/any/javax/code/TwoRepository.class]
This may be due to missing parameter name information
Action:
Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
Ensure that your compiler is configured to use the '-parameters' flag.
You may need to update both your build tool settings as well as your IDE.
(See https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-6.x#parameter-name-retention)
Process finished with exit code 1
We also tested using maven-compiler-plugin
3.13.0, setting the
Comment From: sbrannen
It looks like we'd need to reintroduce support for javax.inject.Qualifier
in QualifierAnnotationAutowireCandidateResolver
, like we did for jakarta.inject.Named
in #31090.
Comment From: sbrannen
Hi @marcioscharamtrustly,
Congratulations on submitting your first issue for the Spring Framework! 👍
And thanks for the detailed description and sample project.
This has been addressed for inclusion in the upcoming Spring Framework 6.1.12.
Comment From: marcioscharamtrustly
Glad to help and thank you all by the fast analysis and response.