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)
  }

}

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

MyFutureController.scala,另一场比赛!应用程序 \app\controllers\MyFutureController.scala

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

2 回答 2

32

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

全局= my.packaged.Global

于 2012-06-27T01:41:45.217 回答
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包中,并且可以在应用程序中访问。

于 2012-05-04T05:51:10.720 回答