我在Play项目中使用安全社交。我正在尝试使用我自己的电子邮件进行注册过程。
如何描述:
我的问题是,当我尝试在模板中生成absoute URL时出现错误:
@ securesocial.controllers.routes.Registration.signUp(mailToken).absoluteURL(IdentityProvider.sslEnabled)
这是错误日志:
[error] play - 无法调用动作,最终出错: java.lang.Runt imeException:没有可用的HTTP上下文 这里。 [错误]申请 -
! @ 6j0al12dk - 内部服务器错误,(POST)[/注册] - >
play.api.Application $$ anon $ 1:执行异常[[RuntimeException: 这里没有可用的HTTP上下文。]] at play.api.Application $ class.handleError(Application.scala:293)〜[play_ 2.10.jar:2.2.3] at play.api.DefaultApplication.handleError(Application.scala:399)[play_ 2.10.jar:2.2.3] 在play.core.server.netty.PlayDefaultUpstreamHandler $$ anonfun $ 3 $$ anonfun $ applyOrElse $ 3.apply(PlayDefaultUpstreamHandler.scala:264) [play_2.10.jar:2.2.3]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun
$ $ applyOrElse 3.apply(PlayDefaultUpstreamHandler.scala:264) [play_2.10.jar:2.2.3]
at scala.Option.map(Option.scala:145) [scala-library.jar:na] at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3.applyOrE
lse(PlayDefaultUpstreamHandler.scala:264)[play_2.10.jar:2.2.3]导致 by:java.lang.RuntimeException:没有可用的HTTP上下文 从这里。 at play.mvc.Http $ Context.current(Http.java:30)〜[play_2.10.jar:2.2.3] at play.mvc.Http $ Context $ Implicit.ctx(Http.java:196)~[play_2.10.jar:2.2.3] at play.core.j.PlayMagicForJava $ .requestHeader(TemplateMagicForJava.scal) a:56)〜[play-java_2.10.jar:2.2.3] 在views.html.custom.mails.signUpEmail $ .apply(signUpEmail.template.scala) :42)〜[classes /:na] 在plugins.NekViews.getSignUpEmail(NekViews.scala:100)〜[classes /:na] 在securesocial.core.providers.utils.Mailer $ .sendSignUpEmail(Mailer.scal) a:49)〜[securesocial_2.10-2.1.3.jar:2.1.3] [info]应用 - [securesocial]卸载身份提供者:userpass [info]应用程序 - [securesocial]卸载密码hasher bcrypt [info] play - 关闭应用程序 默认的Akka系统。
有人知道错误是什么吗?
答案 0 :(得分:0)
您的模板需要隐式请求,这是获取绝对URL所必需的。
@(/*template's parameters*/)(implicit request: RequestHeader)
此请求必须在呈现模板的方法中可用。
答案 1 :(得分:0)
如果不一样,我有一个非常类似的错误,可能你也在你的项目中混合了一些java代码。
您必须在控制器中创建一个java上下文(在本例中为自定义视图控制器),以供视图使用。
例如:
创建Java上下文的Scala助手
object JavaContext {
import play.mvc.Http
import play.core.j.JavaHelpers
def withContext[Status](block: => Status)(implicit header: RequestHeader): Status = {
try {
Http.Context.current.set(JavaHelpers.createJavaContext(header))
block
}
finally {
Http.Context.current.remove()
}
}
}
用法:
class CustomSecureSocialTemplates(env:RuntimeEnvironment[_]) extends ViewTemplates.Default(env:RuntimeEnvironment[_])
{
override def getLoginPage(form: Form[(String, String)],
msg: Option[String] = None)(implicit request: RequestHeader, lang: Lang): Html = {
JavaContext.withContext {
views.html.security.login(form,msg)
}
}
//...
}