Play framework 2.5 でコントローラを作成すると『trait Singleton is abstract; cannot be instantiated』と表示される
こんにちはKUJIRAです。Play2.5を勉強してて、表題のエラーが出たのでメモ。
事象
以下のコードを実行すると『trait Singleton is abstract; cannot be instantiated』とエラーが出力されアプリケーションが動かない
問題のコード
1 2 3 4 5 6 7 8 9 10 11 12 |
package controllers import com.google.inject.Inject import play.api.mvc._ @Singleton class Application @Inject() extends Controller { def index = Action { Ok(views.html.index()) } } |
出力されたエラーメッセージ
[info] Compiling 6 Scala sources and 1 Java source to /tmp/test_project/target/scala-2.11/classes... [error] /tmp/test_project/app/controllers/Application.scala:6: trait Singleton is abstract; cannot be instantiated [error] @Singleton [error] ^ [error] one error found [error] (compile:compileIncremental) Compilation failed [info] Compiling 6 Scala sources and 1 Java source to /tmp/project/target/scala-2.11/classes... [error] /tmp/project/app/controllers/Application.scala:6: trait Singleton is abstract; cannot be instantiated [error] @Singleton [error] ^ [error] one error found [error] (compile:compileIncremental) Compilation failed [error] application - ! @735dd6521 - Internal server error, for (GET) [/index] -> play.sbt.PlayExceptions$CompilationException: Compilation error[trait Singleton is abstract; cannot be instantiated] at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) at scala.Option.map(Option.scala:145) at play.sbt.run.PlayReload$$anonfun$taskFailureHandler$1.apply(PlayReload.scala:49) at play.sbt.run.PlayReload$$anonfun$taskFailureHandler$1.apply(PlayReload.scala:44) at scala.Option.map(Option.scala:145) at play.sbt.run.PlayReload$.taskFailureHandler(PlayReload.scala:44) at play.sbt.run.PlayReload$.compileFailure(PlayReload.scala:40) at play.sbt.run.PlayReload$$anonfun$compile$1.apply(PlayReload.scala:17) at play.sbt.run.PlayReload$$anonfun$compile$1.apply(PlayReload.scala:17)
原因
@Singletonのimport宣言ができていないため問題が発生する。このアノテーションは『com.google.inject』ライブラリのものなのでそれをインポートしなければいけない
対処
対処は以下
1 2 3 4 5 6 7 8 9 10 11 12 |
package controllers import com.google.inject.{Inject, Singleton} // <= ★com.google.inject.Singletonを追加する import play.api.mvc._ @Singleton class Application @Inject() extends Controller { def index = Action { Ok(views.html.index()) } } |
解決。以上、KUJIRAでした。