Play2 Scala - 全球无法施展.GlobalSettings

时间:2012-11-22 07:35:26

标签: playframework playframework-2.0 akka

我试图在app / Global.scala中创建一个Global对象来运行Akka调度程序,就像其他SO帖子所说的那样。

我的代码几乎是Global对象教程的复制/粘贴,但在启动时我收到以下错误:

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 / play.api.GlobalSettings等。一个对象似乎是用于Java的用途,另一个用于Scala,但包名称使这不是很明显。我正在使用Scala和Scala全局对象导入“play.api.GlobalSettings”,那么为什么它需要尝试转换为play.GlobalSettings,这似乎更面向Java(我尝试扩展这个并且它没有工作要么,也不是教程所说的那样)

由于

3 个答案:

答案 0 :(得分:10)

您必须使用对象,而不是使用Scala Global对象的类:

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

查看Global object with Scala

上的Play文档

关于针对play.*的{​​{1}},确定不同之处并不明显。我们只说Play的核心是Scala(api),而Java部分只是它的一个包装。

答案 1 :(得分:1)

确保您使用play.api.GlobalSettings代替Scala,而不是play.GlobalSettings这是Java版本。否则,您可以获得此类投射警告。

答案 2 :(得分:0)

如果您碰巧有一个带有伴侣对象的课程:

class Global extends WithFilters...

object Global extends Global

然后它也会在启动时失败并出现相同的错误。解决方案是使类抽象:

abstract class Global extends WithFilters...

这是因为Play!在查找作为对象的scala Global之前,首先查找java Global,这是一个类。