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、別のプレイ!アプリケーション\app\ controllers \ MyFutureController.scala

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

2 に答える 2

32

回避策 #3 もあります。グローバル クラスをパッケージに移動し、その完全修飾名を application.conf ファイルに指定します。次のようにします。

global= my.packaged.Global

于 2012-06-27T01:41:45.217 に答える
3

問題は、Globalオブジェクトがデフォルトのパッケージにあることです。また、Java では、デフォルト パッケージのクラスは他のパッケージから参照できず、同じパッケージ内でのみアクセスできます (デフォルト)。

この問題には 2 つの回避策があります。

  1. MyWebsocketConnection名前付きパッケージ (たとえば) に移動しconfigて、アプリケーションでアクセスできるようにします。

    object MyLogger {
      def info(message: String) = {
      config.MyWebsocketConnection.logger.send(message)
      }
    }
    
  2. アプリケーション全体を単一のパッケージに移動します (ただし、これは非常に面倒です)

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

    次に、Globalオブジェクトはfooパッケージに常駐し、アプリケーション内でアクセスできるようになります。

于 2012-05-04T05:51:10.720 に答える