2012-05-03 3 views
23

응용 프로그램 시작시 인스턴스화되는 객체를 선언했습니다. 플러그인의 일부인 컨트롤러 내부에서 액세스하려고합니다. 그 플러그인을 사용할 수 있기를 원하지만, 첫 번째 부분을 지나갈 수는 없습니다 - MyWebsocketConnection 개체를 찾습니다. 모든 예제에서는이를 수행하는 방법을 보여주지 않습니다. 플러그인을 쓰고 있기 때문에 컨트롤러에 삽입하고 싶지 않습니다. (나는 어딘가에서 그것을하는 정적 인 예를 보았습니다.) 응용 프로그램을 플러그인 재생! 2.0 스칼라 - 전역 객체 액세스

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

object MyLogger { 

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

} 

플러그인

MyLogger.Scala, 그래서, 놀이에서! 플러그인을 참조하는 2.0 응용 프로그램, 나는 (아마도) 아래처럼 뭔가를 할 것이지만, 전에도이 부분을 지나칠 수 없다 :

MyFutureController.scala, 또 다른 플레이! 응용 프로그램 \ 응용 프로그램 \ 컨트롤러는 문제가 Global 객체가 기본 패키지에있는 것입니다 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 = ...'입니다. 당신은 맞습니다. 그것은'application'없이'global = ... '이어야합니다. – samwize

3

\. Java에서 기본 패키지의 클래스는 다른 패키지에서 참조 할 수 없으며 동일한 패키지 내에서만 액세스 할 수 있습니다 (기본값).

이 문제의 해결 방법은 두 가지입니다. 일부라는 이름의 패키지에

  1. 이동 MyWebsocketConnection은 (config를 말) 그래서 응용 프로그램에 액세스 할 수 있습니다.

    object MyLogger { 
        def info(message: String) = { 
        config.MyWebsocketConnection.logger.send(message) 
        } 
    } 
    
  2. 은 하나의 패키지로 전체 응용 프로그램을 이동

    (하지만 많은 고통입니다)

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

    그런 다음 Global 개체가 foo 패키지에 상주하고 응용 프로그램 내에서 액세스 할 수 있습니다.