Вопрос по playframework-2.0 – Играть! 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)
  }

}

Итак, из игры! Приложение 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   ответа
3

Global Объекты находятся в пакете по умолчанию. А в Java на классы из пакета по умолчанию нельзя ссылаться из других пакетов, они доступны только внутри одного пакета (по умолчанию).

Я вижу два обходных решения этой проблемы.

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

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.

32

переместите ваш класс Global в пакет и укажите его полное имя в файле application.conf, например:

global= my.packaged.Global

Error: User Rate Limit Exceededapplication.global=...Error: User Rate Limit Exceededglobal=...Error: User Rate Limit Exceededapplication.
Error: User Rate Limit Exceeded

Похожие вопросы