2012-11-22 13 views
3

我試着在app/Global.scala中創建一個Global對象來運行Akka調度器,就像其他一些SO帖子說的一樣。Play2 Scala - 全局不能投入播放。GlobalSettings

我的代碼幾乎是複製了全局對象教程/粘貼,但在啓動時,我得到以下錯誤:

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>[email protected]</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等一個obj ect似乎是用於Java的,另一個用於Scala,但是包名稱並不是很明顯。我正在使用Scala和一個導入「play.api.GlobalSettings」的Scala全局對象,那麼爲什麼它需要嘗試投射到play.GlobalSettings,這看起來更加面向Java(我試圖擴展這個並且它也不起作用,並且它不是教程說什麼)

感謝

回答

10

你必須使用一個對象,而不是與斯卡拉全球對象類:

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

看看播放文件上Global object with Scala

抗體出play.*play.api.*,這是肯定的,它是不明顯的差異。我們只是說Play的核心是Scala(api),而Java部分只是它的一個包裝。

+0

arf謝謝你的發現,我沒有注意到我寫了類而不是對象:) –

+0

它碰巧是我們最好的;-) –

+0

謝謝兄弟.... – saman

0

如果你碰巧有一類與同伴對象:

class Global extends WithFilters...

object Global extends Global

那麼它也失敗在啓動時使用相同的錯誤。該解決方案是使抽象類:

abstract class Global extends WithFilters...

這是因爲玩遊戲!首先查找一個java Global,這是一個類,然後查找一個scala Global,它是一個對象。

1

請確保您使用的是Scala的play.api.GlobalSettings,而不是play.GlobalSettings這是Java版本。否則,你可以得到這個類的鑄造警告。