Ответ 1
Существует также обходной путь №3: переместите ваш глобальный класс в пакет и укажите его полное имя в файле application.conf, например:
global = my.packaged.Global
Я объявил объект, который создается при запуске приложения. Я хочу получить доступ к нему внутри контроллера, который является частью плагина. Я хочу иметь возможность использовать этот плагин, но, похоже, я не могу пройти мимо первой части - найти объект 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!")
}
}
Существует также обходной путь №3: переместите ваш глобальный класс в пакет и укажите его полное имя в файле application.conf, например:
global = my.packaged.Global
Проблема заключается в том, что ваши объекты Global
находятся в пакете по умолчанию. И в Java классы из пакета по умолчанию нельзя ссылаться на другие пакеты, они доступны только в одном пакете (по умолчанию).
Я вижу два обходных пути этой проблемы.
Переместите MyWebsocketConnection
в некоторый именованный пакет (скажем config
), чтобы он мог быть доступен в вашем приложении.
object MyLogger {
def info(message: String) = {
config.MyWebsocketConnection.logger.send(message)
}
}
Переместите все ваше приложение в один пакет (но это большая боль)
foo
|--controllers
|--models
|--views
|--Global.scala
Затем объект Global
будет находиться в пакете foo
и будет доступен в приложении.