3

他のSOの投稿が言っていたように、app/Global.scalaにGlobalオブジェクトを作成してAkkaスケジューラーを実行しようとしました。

私のコードはほぼグローバルオブジェクトチュートリアルのコピー/貼り付けですが、起動時に次のエラーが発生します。

Oops, cannot start the server.
PlayException: Cannot init the Global object [Global cannot be cast to play.GlobalSettings]
    at play.api.PlayException$.apply(Exceptions.scala:122)
    at play.api.Application$$anonfun$3.apply(Application.scala:71)
    at play.api.Application$$anonfun$3.apply(Application.scala:67)
    at play.utils.Threads$.withContextClassLoader(Threads.scala:17)
    at play.api.Application.<init>(Application.scala:66)
    at play.core.StaticApplication.<init>(ApplicationProvider.scala:49)
    at play.core.server.NettyServer$.createServer(NettyServer.scala:132)
    at play.core.server.NettyServer$$anonfun$main$5.apply(NettyServer.scala:153)
    at play.core.server.NettyServer$$anonfun$main$5.apply(NettyServer.scala:152)
    at scala.Option.map(Option.scala:133)
    at play.core.server.NettyServer$.main(NettyServer.scala:152)
    at play.core.server.NettyServer.main(NettyServer.scala)
Caused by: java.lang.ClassCastException: Global cannot be cast to play.GlobalSettings
    at play.api.Application.liftedTree1$1(Application.scala:44)
    at play.api.Application.play$api$Application$$javaGlobal(Application.scala:43)
    at play.api.Application$$anonfun$3.apply(Application.scala:68)
    ... 10 more

これが私のコードです:

import play.api._
import play.api.Play.current
import akka.util.duration._
import play.api.libs.concurrent._

/**
 * @author Sebastien Lorber (<i>lorber.sebastien@gmail.com</i>)
 * Date: 21/11/12 - Time: 21:55
 */
class Global extends GlobalSettings {

  override def onStart(app: Application) {
    Logger.info("Application has started")
    startElasticSearchIndexationScheduling
  }

  override def onStop(app: Application) {
    Logger.info("Application shutdown...")
  }

  def startElasticSearchIndexationScheduling = {
    Akka.system.scheduler.schedule(5 seconds, 15 seconds) {
      Logger.info("Doing ElasticSearch reindexation (TODO: just testing scheduler")
    }
  }


}

あなたが見るような派手なものはありません...

ちなみに、なぜ同じ名前のオブジェクトなどに2つの異なるパッケージがあるのか​​わかりませんplay.GlobalSettings。1play.api.GlobalSettingsつのオブジェクトはJava用で、もう1つはScala用のようですが、パッケージ名からはあまりわかりません。そして、私は「play.api.GlobalSettings」をインポートするScalaグローバルオブジェクトでScalaを使用しているので、なぜplay.GlobalSettingsJava指向のように見えるキャストを試みる必要があるのですか(これを拡張しようとしましたが、どちらも機能しません。チュートリアルの内容ではありません)

ありがとう

4

3 に答える 3

10

Scala Global オブジェクトを持つクラスではなく、オブジェクトを使用する必要があります。

...
object Global extends GlobalSettings {
...
}

Scala を使用したグローバル オブジェクトに関する Play のドキュメントをご覧ください。

play.*反対についてはplay.api.*、違いを生むことは明らかではありません。Play のコアは Scala (api) であり、Java 部分はそれを包む単なるラッパーであるとしましょう。

于 2012-11-22T07:51:16.990 に答える
1

Java バージョンではplay.api.GlobalSettingsなく、Scalaを使用していることを確認してください。play.GlobalSettingsそうしないと、このクラス キャストの警告が表示される可能性があります。

于 2015-11-10T20:07:31.400 に答える