这个控制器实例化异常是什么意思



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

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

几周来,我一直在寻找我的应用程序和正在运行的种子应用程序之间的可疑差异,但我找不到任何差异。我的应用程序控制器看起来像:

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

我的路线看起来和种子应用程序的一样,非常简单:

GET         /                                      @controllers.ApplicationController.index

你想到什么了吗?我应该看什么?我在这个问题上被难住了一段时间,我知道这是一个可怕的问题,但在这一点上我别无选择。不幸的是,错误消息似乎没有显示任何有用的信息。我仍然不怀念Rails。

我猜你是在将其与Silhouette Seed进行比较。轮廓种子使用Guice来实例化控制器。

这需要在自定义全局对象中进行配置。参见此处

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"对其进行配置。

例如

application.global=app.Global

最新更新