I have this dependency:
@Singleton
class SpiceMix @Inject constructor(@field:[Named("oregano")] private val oregano: Spice,
@field:[Named("sage")] private val sage: Spice,
@field:[Named("rosemary")] private val rosemary: Spice)
And a module to fulfill its dependencies:
@Module
class SpiceModule {
@Provides
@Named("oregano")
@Singleton
fun provideOregano(): Spice = Oregano()
@Provides
@Named("sage")
@Singleton
fun provideSage(): Spice = Sage()
@Provides
@Named("rosemary")
@Singleton
fun provideRosemary(): Spice = Rosemary()
The SpiceMix
is then injected in various locations of my app.
However, this does not compile and I get an error:
Spice cannot be provided without an @Provides-annotated method
I think the @Named annotations do not quite work in my constructor signature. I am not quite sure how I can make it work.
Note: this compiles fine if I ditch the Named annotations and change the types of the constructor parameters to their concrete forms. However, Spice is an interface, and I need it for mocking purposes in my tests.
What can I do?
You want to annotate the constructor parameters if you're doing constructor injection, and not the fields - use the
@param:
annotation target:Edit: actually, since the resolution order for annotation targets is
according to the docs, having no annotation target should also annotate the parameter of the constructor. So you can just drop the target altogether: