Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Playframework 播放框架:反向路由时出现NoSuchFieldError_Playframework - Fatal编程技术网

Playframework 播放框架:反向路由时出现NoSuchFieldError

Playframework 播放框架:反向路由时出现NoSuchFieldError,playframework,Playframework,这是我的common.routes文件: GET /emails/:deflated controllers.common.Emails.viewInBrowser(deflated) 。。。这里是我的控制器: package controllers.common object Emails extends Controller { def viewInBrowser(deflated: String) = Action { implicit request =>

这是我的
common.routes
文件:

GET     /emails/:deflated   controllers.common.Emails.viewInBrowser(deflated)
。。。这里是我的控制器:

package controllers.common

object Emails extends Controller {

  def viewInBrowser(deflated: String) = Action { implicit request =>
    GZip.inflate(deflated) match {
      case Success(inflated) => Ok(Html(inflated))
      case Failure(e) => {
        Logger.warn(s"error inflating email from url", e)
        val support = configuration.getString("application.emails.support")
        BadRequest(views.html.badRequest(Messages("common.error.invalidOrMalformedUrl", support)))
      }
    }
  }
}
上面的代码运行良好。。。但如果我像这样倒转路线

import controllers.common.routes
...

val sslEnabled = configuration.getBoolean("ssl").getOrElse(false)
val emailUrl = routes.Emails.viewInBrowser(true).absoluteURL(sslEnabled)
GET     /emails/:deflated   controllers.common.webmail.Emails.viewInBrowser(deflated)
。。。我始终支持以下例外情况:

java.lang.NoSuchFieldError: Emails
at utils.common.RoutesHelper$.emailUrl(RoutesHelper.scala:51)
at services.common.DefaultEmailComponent$DefaultRichBody.apply(EmailComponent.scala:64)
at services.common.DefaultEmailServiceComponent$DefaultEmailService.sendEmail(EmailServiceComponent.scala:81)
at utils.auth.EmailHelper$.sendUserVerificationEmail(EmailHelper.scala:32)
at controllers.auth.Users$$anonfun$create$1$$anonfun$8$$anonfun$apply$60$$anonfun$apply$61.apply(Users.scala:381)
at controllers.auth.Users$$anonfun$create$1$$anonfun$8$$anonfun$apply$60$$anonfun$apply$61.apply(Users.scala:379)
at scala.util.Success$$anonfun$map$1.apply(Try.scala:206)[ERROR] [05/30/2014 16:35:05.350] [play-akka.actor.default-dispatcher-4] [ActorSystem(play)] Uncaught error from thread [play-akka.actor.default-dispatcher-4] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled
有什么想法吗?我验证了我能做的一切(配置文件、路由、控制器)。。。但没有办法找出问题所在。我正在使用Play 2.2.3

更新


非常奇怪的是,我试图将我的
电子邮件
控制器移动到另一个包(即
型号
)中,在这种情况下,反向路由再次起作用。有什么bug在起作用吗?

在花了一整晚的时间来弄清楚如何让它工作之后,我刚刚修改了这样的路线

import controllers.common.routes
...

val sslEnabled = configuration.getBoolean("ssl").getOrElse(false)
val emailUrl = routes.Emails.viewInBrowser(true).absoluteURL(sslEnabled)
GET     /emails/:deflated   controllers.common.webmail.Emails.viewInBrowser(deflated)
我的控制器是这样的:

package controllers.common.webmail

object Emails extends Controller {
  ...
}
将包重命名为controllers.common.webmail解决了问题,反向路由现在可以工作了。。。但别问我为什么:-(


我想应该有一个bug在起作用。我希望这会有所帮助。

据我所知,如果根项目和其中一个子项目中的同一个包中定义了路由,则生成的子项目
routes
对象会对根项目隐藏相同的对象,并且所有引用旧
路由的代码都会变成e可怕的

例如,如果根项目中的
路由
文件包含路由

GET /path       mypackage.MyController.someAction
GET /otherPath  mypackage.MyOtherController.otherAction
并且
子项目.routes
文件包含一个路由

GET /path       mypackage.MyController.someAction
GET /otherPath  mypackage.MyOtherController.otherAction
这两个项目都会在构建期间生成
mypackage.routes
对象,其中一个项目会在运行时隐藏另一个项目


解决方案是在自己的包中定义根项目中未显示的所有子项目路线。

是否使用子项目?似乎与此问题有关:是的,我知道……我读了此问题,但没有帮助。无论如何,感谢您的评论。好的……不过我在回答中发布了帮助我解决问题的解决方案类似的问题。我的项目中的问题是,我在所有子项目中共享同一个资产控制器…我认为这是有意义的,但正如5月份邮件列表中所报告的,这是一个编译器限制。无论如何,非常感谢您的支持;-)