Play! 2.0 Scala - 访问全局对象

23

我已经声明了一个对象,在应用程序启动时进行实例化。我想在插件的控制器中访问它。我想要能够使用该插件,但似乎无法通过第一步--查找 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,另一个Play!应用程序 \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个回答

32

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

global= my.packaged.Global


(注:该方法可用于解决与Play框架相关的问题)

2
默认值为 application.global=...。你是正确的,应该是 global=...,不要带上 application - samwize

3
问题在于您的Global对象位于默认包中。在Java中,来自默认包的类无法从其他包中引用,它们只能在同一包(默认包)中访问。
我看到了两种解决方法。
  1. Move MyWebsocketConnection to some named package (say config) so it can be accessible in your application.

    object MyLogger {
      def info(message: String) = {
      config.MyWebsocketConnection.logger.send(message)
      }
    }
    
  2. Move your whole application into single package (but it is a lot of pain)

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

    Then Global object will resides in foo package and will be accessible within application.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接