Подтвердить что ты не робот

Играть! 2.0 Scala - Доступ к глобальному объекту

Я объявил объект, который создается при запуске приложения. Я хочу получить доступ к нему внутри контроллера, который является частью плагина. Я хочу иметь возможность использовать этот плагин, но, похоже, я не могу пройти мимо первой части - найти объект MyWebsocketConnection. Ни один из примеров не показывает, как это сделать. Я не хочу вводить в контроллер, потому что я пишу плагин (я видел статические примеры того, как это сделать где-то).

Global.scala, приложение-плагин\приложение\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, приложение-плагин\приложение\контроллеры\MyLogger.scala

object MyLogger {

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

}

Итак, из Play! 2.0, которое ссылается на плагин, я бы (возможно) сделал что-то вроде ниже, но я не могу даже пройти мимо части до этого:

MyFutureController.scala, другое Play! application\app\controllers\MyFutureController.scala

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

Ответ 1

Существует также обходной путь №3: переместите ваш глобальный класс в пакет и укажите его полное имя в файле application.conf, например:

global = my.packaged.Global

Ответ 2

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

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

  • Переместите MyWebsocketConnection в некоторый именованный пакет (скажем config), чтобы он мог быть доступен в вашем приложении.

    object MyLogger {
      def info(message: String) = {
      config.MyWebsocketConnection.logger.send(message)
      }
    }
    
  • Переместите все ваше приложение в один пакет (но это большая боль)

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

    Затем объект Global будет находиться в пакете foo и будет доступен в приложении.