我有一个带有以下签名的模块类:
class SilhouetteModule extends AbstractModule with ScalaModule {
我想注入配置:
class SilhouetteModule @Inject() (configuration: Configuration) extends AbstractModule with ScalaModule {
但它失败并出现以下错误。
No valid constructors
Module [modules.SilhouetteModule] cannot be instantiated.
Play文档提到了
在大多数情况下,如果您在创建组件时需要访问Configuration,则应将Configuration对象注入组件本身或...
,但我无法弄清楚如何成功地做到这一点。所以问题是,如何在Play 2.5中将依赖注入模块类?
答案 0 :(得分:3)
有两种解决方案可以解决您的问题。
第一个(更直接的一个):
不要扩展com.google.inject.AbstractModule
。而是使用play.api.inject.Module
。扩展会强制您覆盖def bindings(environment: Environment, configuration: Configuration): Seq[Binding[_]]
。在该方法中,您可以执行所有绑定,并将配置作为方法参数插入。
第二个(以及更灵活的一个): 根据您要注入的组件的需要,您可以为要绑定的组件定义提供程序。在该提供者中,您可以注入任何您想要的东西E.g。
import com.google.inject.Provider
class MyComponentProvider @Inject()(configuration:Configuration) extends Provider[MyComponent] {
override def get(): MyComponent = {
//do what ever you like to do with the configuration
// return an instance of MyComponent
}
}
然后你可以在你的模块中绑定你的组件:
class SilhouetteModule extends AbstractModule {
override def configure(): Unit = {
bind(classOf[MyComponent]).toProvider(classOf[MyComponentProvider])
}
}
第二个版本的优点是,您可以注入您喜欢的任何内容。在第一个版本中,您只需"只需"配置。
答案 1 :(得分:0)
从以下位置更改构造函数签名:
class SilhouetteModule @Inject() (configuration: Configuration) extends AbstractModule with ScalaModule
收件人:
class SilhouetteModule(env: Environment, configuration: Configuration) extends AbstractModule with ScalaModule
有关更多信息,请参见此处: https://github.com/playframework/playframework/issues/8474