这个Controller Instantiation异常是什么意思?

时间:2015-02-26 00:13:50

标签: scala playframework

我在运行时遇到以下错误:

java.lang.InstantiationException: controllers.ApplicationController
at java.lang.Class.newInstance(Class.java:418) ~[na:1.8.0_11]
at play.api.GlobalSettings$class.getControllerInstance(GlobalSettings.scala:198) ~[play_2.11-2.3.7.jar:2.3.7]
at play.api.DefaultGlobal$.getControllerInstance(GlobalSettings.scala:206) ~[play_2.11-2.3.7.jar:2.3.7]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$1$$anonfun$apply$43.apply(routes_routing.scala:198) ~[na:na]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$1$$anonfun$apply$43.apply(routes_routing.scala:198) ~[na:na]
Caused by: java.lang.NoSuchMethodException: controllers.ApplicationController.<init>()

我一直在寻找我的应用与a working seed app之间可疑差异的几周,但我无法找到。我的应用程序控制器看起来像:

class ApplicationController @Inject() (implicit val env: Environment[User, SessionAuthenticator]) extends Silhouette[User, SessionAuthenticator] { ... }

我的路线看起来与种子应用程序相同,非常简单:

GET         /                                      @controllers.ApplicationController.index

有什么想到的吗?我应该看什么?我已经被遗忘了一段时间,我知道这是一个可怕的问题,但我现在别无选择。遗憾的是,错误消息似乎并未表明任何有用的内容。我仍然不会错过Rails。

1 个答案:

答案 0 :(得分:4)

我猜你正在将它与Silhouette Seed进行比较。 Silhouette Seed使用Guice来实例化控制器。

这需要在自定义Global对象中配置。见这里

https://github.com/mohiva/play-silhouette-seed/blob/master/app/Global.scala

关键线是

override def getControllerInstance[A](controllerClass: Class[A]) = injector.getInstance(controllerClass)
路由文件时执行的

将控制器定义为一个可实现的类,方法是在控制器前面加上routes.conf中的“@”。

如果您的Global.scala文件不在默认包中,则需要在application.conf文件中使用属性“application.global”对其进行配置。

e.g。

application.global=app.Global