2012-05-03 4 views
23

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

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! Приложение \ APP \ Контроллеры \ MyFutureController.scala

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

ответ

32

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

глобальная = my.packaged.Global

+0

Это лучший ответ. – vaughan

+2

По умолчанию используется 'application.global = ...'. Вы правы, это должно быть 'global = ...' без 'приложения'. – samwize

3

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

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

  1. Move MyWebsocketConnection к некоторому имени пакета (скажем config), поэтому она может быть доступна в приложении.

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

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

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

Смежные вопросы