@Inject对象null:播放依赖注入

时间:2016-06-02 01:27:29

标签: scala dependency-injection playframework-2.1

我在我的控制器类中使用依赖注入进行实例化。当我尝试在其他地方使用@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中已被弃用,所以我仍然有点警告。

1 个答案:

答案 0 :(得分:1)

如果没有询问DI框架,就无法将依赖注入到类实例中。在您的代码中,您手动实例化Obj,这意味着不会发生依赖注入魔法。为了向Obj类注入依赖,它的实例化应该由DI框架处理。你在这里可以做的是:

  1. ServiceClient注入Obj构造函数或提交:

    class Obj @Inject() (client: ServiceClient) {
      //
    }
    

    使用简单的类而不是case类是有意义的,因为case类听起来更像是" data"内部使用不可变数据而不是服务或某个帮助程序类的类。实际上,您当前对Obj类的定义应该有效。

  2. 向您的App类注入Obj和(或根据您的需要)ServiceClient

    class App @Inject()(obj: Obj, client: ServiceClient) extends Controller {
      def getItems = Action  {
        obj.doStuff()
      }
    }
    
  3. 我建议您阅读有关依赖注入和Guice框架的更多信息,默认情况下在Play中使用。 Guice wiki