我在我的控制器类中使用依赖注入进行实例化。当我尝试在其他地方使用@inject注释使用该对象时,我得到null值。这是我的代码框架。
@singleton
class ServiceClient(ws: WSClient, config: Configuration) {
def get response() {...}
}
class App @Inject()(client: ServiceClient) extends Controller {
def getItems = Action {
Obj()
}
}
case class Obj() {
@Inject
var client: ServiceClient = _
def doStuff() {
client.getResponse() //client is null so get null pointer exception.
....
}
}
Obj中的@Inject似乎永远不会起作用。我的客户端对象始终为null。 (我不想将客户端作为param传递给Obj。)我的期望是在控制器中创建的ServiceClient对象应该已经在Obj()中注入。我做错了什么?
更新
将Obj注入控制器,不是一种选择。 (在我的应用程序中,Obj在运行时实例化我的一些复杂的规则,使用反射)。我也不想在Obj中使用构造函数注入。 我正在寻找控制器之外的ServiceClient的现场注入。
UPDATE2
我能够使用
解决问题var client: ServiceClient = play.api.Play.current.injector.instanceOf(classOf[ServiceClient])
在Obj课程中。 但是,play.api.Play.current在play 2.5中已被弃用,所以我仍然有点警告。
答案 0 :(得分:1)
如果没有询问DI框架,就无法将依赖注入到类实例中。在您的代码中,您手动实例化Obj
,这意味着不会发生依赖注入魔法。为了向Obj
类注入依赖,它的实例化应该由DI框架处理。你在这里可以做的是:
将ServiceClient
注入Obj
构造函数或提交:
class Obj @Inject() (client: ServiceClient) {
//
}
使用简单的类而不是case类是有意义的,因为case类听起来更像是" data"内部使用不可变数据而不是服务或某个帮助程序类的类。实际上,您当前对Obj
类的定义应该有效。
向您的App类注入Obj
和(或根据您的需要)ServiceClient
:
class App @Inject()(obj: Obj, client: ServiceClient) extends Controller {
def getItems = Action {
obj.doStuff()
}
}
我建议您阅读有关依赖注入和Guice框架的更多信息,默认情况下在Play中使用。 Guice wiki