这是我的common.routes文件:
GET /emails/:deflated controllers.common.Emails.viewInBrowser(deflated)
Run Code Online (Sandbox Code Playgroud)
...这里是我的控制器:
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)))
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常...但是如果我像这样反转路线
import controllers.common.routes
...
val sslEnabled = configuration.getBoolean("ssl").getOrElse(false)
val emailUrl = routes.Emails.viewInBrowser(true).absoluteURL(sslEnabled)
Run Code Online (Sandbox Code Playgroud)
...我总是以下例外:
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
Run Code Online (Sandbox Code Playgroud)
任何的想法?我验证了我所能做的一切(配置文件,路由,控制器)...但是无法找出问题所在。我正在使用Play 2.2.3。
更新
十分奇怪的是,我尝试将Emails控制器移至另一个程序包(即models),在这种情况下,反向路由再次起作用。Play的某个地方有错误吗?
据我了解,如果在根项目的同一包中定义了路由,并且在子项目之一中定义了路由,则生成的子项目routes对象会在根项目中隐藏相同的对象,并且引用旧routes对象的所有代码都会出错。
例如,如果routes根项目中的文件包含路由
GET /path mypackage.MyController.someAction
Run Code Online (Sandbox Code Playgroud)
并且subproject.routes文件包含一条路线
GET /otherPath mypackage.MyOtherController.otherAction
Run Code Online (Sandbox Code Playgroud)
这两个项目都mypackage.routes在构建期间生成对象,其中一个在运行时隐藏了另一个。
解决方案是在自己的软件包中定义所有子项目路径,这些路径不在根项目中。
| 归档时间: |
|
| 查看次数: |
657 次 |
| 最近记录: |