Playframework Play2 Scala-无法将全局转换为play.GlobalSettings

Playframework Play2 Scala-无法将全局转换为play.GlobalSettings,playframework,playframework-2.0,akka,Playframework,Playframework 2.0,Akka,我试图在app/Global.scala中创建一个全局对象来运行Akka调度程序,就像其他SO帖子所说的那样 我的代码几乎是“全局对象”教程的复制/粘贴,但在启动时,我遇到以下错误: Oops, cannot start the server. PlayException: Cannot init the Global object [Global cannot be cast to play.GlobalSettings] at play.api.PlayException$.appl

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

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

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
Oops,无法启动服务器。
PlayException:无法初始化全局对象[无法将全局强制转换为播放。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)
Atplay.utils.Threads$.withContextClassLoader(Threads.scala:17)
api.Application.(Application.scala:66)
正在运行.core.StaticApplication。(ApplicationProvider.scala:49)
播放时.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)
位于scala.Option.map(Option.scala:133)
at play.core.server.NettyServer$.main(NettyServer.scala:152)
正在运行的.core.server.NettyServer.main(NettyServer.scala)
原因:java.lang.ClassCastException:Global无法强制转换为play.GlobalSettings
at play.api.Application.liftedTree1$1(Application.scala:44)
play$api$Application$$javaGlobal(Application.scala:43)
at play.api.Application$$anonfun$3.apply(Application.scala:68)
... 10多
这是我的密码:

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")
    }
  }


}
import play.api_
导入play.api.play.current
导入akka.util.duration_
导入play.api.libs.concurrent_
/**
*@作者塞巴斯蒂安·洛伯(洛伯)。sebastien@gmail.com)
*日期:2012年11月21日-时间:21:55
*/
类Global扩展了GlobalSettings{
覆盖def onStart(应用程序:应用程序){
Logger.info(“应用程序已启动”)
startElasticSearchIndexationScheduling
}
覆盖def onStop(应用程序:应用程序){
Logger.info(“应用程序关闭…”)
}
def STARTELASTICSEARCHINDEXATION调度={
Akka.system.scheduler.schedule(5秒,15秒){
info(“正在执行ElasticSearch重新索引(TODO:只是测试调度程序”)
}
}
}
没有你看到的那么花哨

顺便说一句,我不明白为什么相同名称的对象通常有两个不同的包
play.GlobalSettings
/
play.api.GlobalSettings
等等。一个对象似乎用于Java,另一个用于Scala,但包名使这一点不太明显。我使用Scala和Scala全局对象导入“play.api.GlobalSettings”那么,为什么它需要尝试转换为
play.GlobalSettings
,这似乎更面向Java(我尝试扩展了这个,但也不起作用,教程中没有这么说)


谢谢

您必须使用对象,而不是带有Scala全局对象的类:

...
object Global extends GlobalSettings {
...
}
请查看上的播放文档


关于
play.*
play.api.*
的区别,可以肯定的是,区别并不明显。让我们说一下,play的核心是Scala(api),Java部分只是围绕它的一个包装器。

如果您碰巧有一个类带有一个伴生对象:

类全局扩展带过滤器…

对象全局扩展全局

然后,它在开始时也会失败,并出现相同的错误。解决方法是将类抽象化:

抽象类全局扩展带过滤器…


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

请确保您使用的是scala的
Play.api.GlobalSettings
,而不是java版本的
Play.GlobalSettings
。否则,您可以得到此类强制转换警告。

arf感谢您的捕获没有注意到我写的是类而不是对象:)这发生在我们当中最好的;-)