2015-05-30 28 views
20

我嘗試編譯書中Scala的例子:「播放斯卡拉」,但得到遊戲控制檯上的以下編譯錯誤:播放框架斯卡拉:編譯錯誤[類型應用程序不包控制器中的一員]

C:\Play\exp\ch6_implicits>activator run 
[info] Loading project definition from C:\Play\exp\ch6_implicits\project 
[info] Set current project to ch6_implicits (in build file:/C:/Play/exp/ch6_implicits/) 

--- (Running the application, auto-reloading is enabled) --- 

[info] p.a.l.c.ActorSystemProvider - Starting application default Akka system: application 
[info] p.c.s.NettyServer$ - Listening for HTTP on /0:0:0:0:0:0:0:0:9000 

(Server started, use Ctrl+D to stop and go back to the console...) 

[info] Compiling 13 Scala sources and 1 Java source to C:\Play\exp\ch6_implicits\target\scala-2.11\classes... 
[error] C:\Play\exp\ch6_implicits\conf\routes:6: type Application is not a member of package controllers 
[error] GET   /        controllers.Application.index 
[error] C:\Play\exp\ch6_implicits\conf\routes:7: type Shop is not a member of package controllers 
[error] GET    /catalog    controllers.Shop.catalog 
[error] C:\Play\exp\ch6_implicits\conf\routes:6: type Application is not a member of package controllers 
[error] GET   /        controllers.Application.index 
[error] C:\Play\exp\ch6_implicits\conf\routes:7: type Shop is not a member of package controllers 
[error] GET    /catalog    controllers.Shop.catalog 
[error] C:\Play\exp\ch6_implicits\conf\routes:6: type Application is not a member of package controllers 
[error] GET   /        controllers.Application.index 
[error] C:\Play\exp\ch6_implicits\conf\routes:7: type Shop is not a member of package controllers 
[error] GET    /catalog    controllers.Shop.catalog 
[error] 6 errors found 
[error] (compile:compileIncremental) Compilation failed 
[error] application - 

! @6mafk6inc - Internal server error, for (GET) [/products/new] -> 

play.sbt.PlayExceptions$CompilationException: Compilation error[type Application is not a member of package controllers] 
     at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) ~[na:na] 
     at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) ~[na:na] 
     at scala.Option.map(Option.scala:145) ~[scala-library-2.11.6.jar:na] 
     at play.sbt.run.PlayReload$$anonfun$taskFailureHandler$1.apply(PlayReload.scala:49) ~[na:na] 
     at play.sbt.run.PlayReload$$anonfun$taskFailureHandler$1.apply(PlayReload.scala:44) ~[na:na] 
     at scala.Option.map(Option.scala:145) ~[scala-library-2.11.6.jar:na] 
     at play.sbt.run.PlayReload$.taskFailureHandler(PlayReload.scala:44) ~[na:na] 
     at play.sbt.run.PlayReload$.compileFailure(PlayReload.scala:40) ~[na:na] 
     at play.sbt.run.PlayReload$$anonfun$compile$1.apply(PlayReload.scala:17) ~[na:na] 
     at play.sbt.run.PlayReload$$anonfun$compile$1.apply(PlayReload.scala:17) ~[na:na] 

Application.scala是:

package controllers 

import play.api._ 
import play.api.mvc._ 

// We extend the 'WithCart' trait, so we have an implicit conversion from RequestHeader to Cart 
object Application extends Controller with WithCart { 

    def index = Action { implicit request => 
    // The index template takes an implicit Cart, which is not available. 
    // However, the WithCart trait has an implicit conversion from 
    // RequestHeader to Cart, and we do have an implicit RequestHeader 
    // here, because `request` is a Request, which extends RequestHeader. 
    Ok(views.html.index()) 
    } 

    def contact = Action { implicit request => 
    Ok(views.html.contact()) 
    } 

}  

Shop.scala是

package controllers 

import play.api._ 
import play.api.mvc._ 
import models._ 

object Shop extends Controller with WithCart { 

    def catalog() = Action { implicit request => 
    val products = ProductDAO.list 
    Ok(views.html.products.catalog(products)) 
    } 

} 

和R歐特斯文件是:

# Routes 
# This file defines all application routes (Higher priority routes first) 
# ~~~~ 

# Home page 
GET /    controllers.Application.index 
GET  /catalog  controllers.Shop.catalog 
GET  /contact  controllers.Application.contact 

# Map static resources from the /public folder to the /assets URL path 
GET  /assets/*file    controllers.Assets.at(path="/public", file) 

播放框架是2.4.0及約說:

[ch6_implicits] $ about 
[info] This is sbt 0.13.8 
[info] The current project is {file:/C:/Play/exp/ch6_implicits/}root 1.0-SNAPSHOT 
[info] The current project is built against Scala 2.11.6 
[info] Available Plugins: sbt.plugins.IvyPlugin, sbt.plugins.JvmPlugin, sbt.plugins.CorePlugin, sbt.plugins.JUnitXmlReportPlugin, play.sbt.Play, play.sbt.PlayAkkaHttpServer, play.sbt.PlayJava, play.sb 
t.PlayLayoutPlugin, play.sbt.PlayNettyServer, play.sbt.PlayScala, play.sbt.routes.RoutesCompiler, play.twirl.sbt.SbtTwirl, com.typesafe.sbt.SbtNativePackager, com.typesafe.sbt.packager.archetypes.Akka 
AppPackaging, com.typesafe.sbt.packager.archetypes.JavaAppPackaging, com.typesafe.sbt.packager.archetypes.JavaServerAppPackaging, com.typesafe.sbt.packager.archetypes.jar.ClasspathJarPlugin, com.types 
afe.sbt.packager.archetypes.jar.LauncherJarPlugin, com.typesafe.sbt.packager.debian.DebianDeployPlugin, com.typesafe.sbt.packager.debian.DebianPlugin, com.typesafe.sbt.packager.debian.JDebPackaging, c 
om.typesafe.sbt.packager.docker.DockerPlugin, com.typesafe.sbt.packager.jdkpackager.JDKPackagerDeployPlugin, com.typesafe.sbt.packager.jdkpackager.JDKPackagerPlugin, com.typesafe.sbt.packager.linux.Li 
nuxPlugin, com.typesafe.sbt.packager.rpm.RpmDeployPlugin, com.typesafe.sbt.packager.rpm.RpmPlugin, com.typesafe.sbt.packager.universal.UniversalDeployPlugin, com.typesafe.sbt.packager.universal.Univer 
salPlugin, com.typesafe.sbt.packager.windows.WindowsDeployPlugin, com.typesafe.sbt.packager.windows.WindowsPlugin, com.typesafe.sbt.web.SbtWeb, com.typesafe.sbt.jse.SbtJsEngine, com.typesafe.sbt.jse.S 
btJsTask, com.typesafe.sbt.coffeescript.SbtCoffeeScript, com.typesafe.sbt.less.SbtLess, com.typesafe.sbt.jshint.SbtJSHint, com.typesafe.sbt.rjs.SbtRjs, com.typesafe.sbt.digest.SbtDigest, com.typesafe. 
sbt.mocha.SbtMocha, com.typesafe.sbteclipse.plugin.EclipsePlugin 
[info] sbt, sbt plugins, and build definitions are using Scala 2.10.4 
[ch6_implicits] $ 

而Java版本是:

C:\Play\exp\ch6_implicits>java -version 
java version "1.8.0_45" 
Java(TM) SE Runtime Environment (build 1.8.0_45-b15) 
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode) 

C:\Play\exp\ch6_implicits>javac -version 
javac 1.8.0_45 

任何想法有什麼問題,如何解決這一問題?

到目前爲止,其他示例在我的環境中編譯並運行時沒有錯誤。

感謝您的支持!

回答

44

默認情況下,播放2.4會生成依賴注入路由器,與以前不同,它使用靜態路由器。你有兩個選擇,從build.sbt中刪除routesGenerator行,這樣play會產生一個靜態路由器,或者(更好地)讓你的控制器類而不是對象,並使用依賴注入。

+0

這兩個選項爲我工作。感謝您的完美回答! – user4955663

+5

這個(又一個)突破性變革背後的哲學是什麼? – Ashesh

+0

實際上,這不是一個突破性的改變,因爲它只是新項目的默認設置 - 現有項目使用靜態路由器,並且必須明確地加入DI路由器。哲學是全球狀態非常糟糕,它使測試變得困難,並且使得更難推理應用程序。靜態路由器強制全局狀態。 –

1

刪除routesGenerator:= InjectedRoutesGenerator從YOUT文件build.sbt和所有將工作

0

更改你的對象一類是這樣的:

object Shop extends Controller with WithCart { 
class Shop extends Controller with WithCart { 

object Application extends Controller with WithCart { 
class Application extends Controller with WithCart {