Play Framework For Scala: Compilation error[type Application is not a member of package controllers]

27,293

Solution 1

Play 2.4, by default, generates a dependency injected router, unlike previously, when it used a static router. You have two options, remove the routesGenerator line from build.sbt so play will generate a static router, or (better) make your controllers classes instead of objects, and use dependency injection.

Solution 2

remove routesGenerator := InjectedRoutesGenerator from yout file build.sbt and all will work

Share:
27,293

Related videos on Youtube

user4955663
Author by

user4955663

Updated on July 09, 2022

Comments

  • user4955663
    user4955663 almost 2 years

    I try to compile a scala example in the book: "Play for Scala" but get a following compilation error on Play console:

    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 is:

    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 is

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

    And routes file is:

    # 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)
    

    Play Framework is 2.4.0 and about says:

    [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] $
    

    And Java version is:

    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
    

    Any ideas what's the problem and how to fix this?

    So far other examples have compiled and run without error in my environment.

    Thank you for your support!

  • Ashesh
    Ashesh over 8 years
    And what is the philosophy behind this (yet another) breaking change?
  • James Roper
    James Roper over 8 years
    Actually, it's not a breaking change, since it's only the default for new projects - existing projects use a static router, and have to explicitly opt in to a DI router. The philosophy is that global state is really bad, it makes testing difficult, and makes it harder to reason about your application. A static router forces global state.
  • SkyWalker
    SkyWalker over 8 years
    A self contained simple example would be most welcome, I didn't upvote because now I have to lookup somewhere else how to do the controller injection
  • toidiu
    toidiu over 8 years
    So this definitely deserves a question of its own: Now that we don't have global state is that bad? My actor seemed to be re-created each time we make a request. Is there a way to hold on to state within the Controller?
  • toidiu
    toidiu over 8 years
    To inject to controller add a '@' in front of the function definition in your router and make the Controller a class. ex: GET /index @controllers.Application.index playframework.com/documentation/2.4.x/…
  • DataGuru
    DataGuru over 8 years
    Changing the build.sbt file looks to be better as I had problems during test when I change the application to be a class instead of an object
  • kn3l
    kn3l over 7 years
    play 2.5.x remove static from methods inside controller.