玩! 2.0 Scala - 访问全局对象

时间:2012-05-03 23:44:11

标签: scala global sbt playframework-2.0

我已经声明了一个在应用程序启动时实例化的对象。我想在控制器内访问它,它是插件的一部分。我希望能够使用该插件,但我似乎无法超越第一部分 - 找到MyWebsocketConnection对象。这些例子都没有显示如何做到这一点。我不想注入控制器,因为我正在编写一个插件(我看到了如何在某处做的静态示例)。

Global.scala,插件应用\ app \ Global.scala

object Global extends GlobalSettings {

  object MyWebsocketConnection {
    val logger = // return something that gets instantiated once, like websocket object for logging to ui
  }

  class MyWebsocketConnection {
    import MyWebsocketConnection.logger
  }

  override def onStart(app: Application) {
    Logger.info("Application has started...");
  }

}

我的自定义日志插件控制器:

MyLogger.Scala,插件应用程序\ app \ controllers \ MyLogger.scala

object MyLogger {

  def info(message: String) = {
    // THIS CAN'T BE FOUND ?
    // MyWebsocketConnection.logger.send(message)
  }

}

所以,从Play!引用插件的2.0应用程序,我会(可能)做类似下面的事情,但在此之前我甚至无法超越部分:

MyFutureController.scala,另一个游戏! application \ app \ controllers \ MyFutureController.scala

object MyFutureController extends Controller {
  def someRandomMethod = Action {
    // Custom logging
    MyLogger.info("Here's my log message!");
    Ok("This documentation stinks!")
  }
}

2 个答案:

答案 0 :(得分:32)

还有解决方法#3:将Global类移动到一个包并在application.conf文件中指定其完全限定名,如下所示:

  

global = my.packaged.Global

答案 1 :(得分:3)

问题是您的Global个对象位于默认包中。在Java中,默认包中的类不能从其他包中引用,只能在同一个包中访问它们(默认)。

我看到了这个问题的两个解决方法。

  1. MyWebsocketConnection移至某个命名包(例如config),以便可以在您的应用中访问它。

    object MyLogger {
      def info(message: String) = {
      config.MyWebsocketConnection.logger.send(message)
      }
    }
    
  2. 将整个应用程序移到单个包中(但这很痛苦)

    foo
      |--controllers
      |--models
      |--views
      |--Global.scala
    

    然后Global对象将驻留在foo包中,并且可以在应用程序中访问。