在Play框架和Secure社交中获取绝对URL

我在Play项目中使用安全社交 . 我正在尝试使用我自己的电子邮件进行注册过程 .

这里有如何描述:

http://securesocial.ws/guide/views-customization.html

我的问题是,当我尝试在模板中创建absoute URL时出现错误:

@securesocial.controllers.routes.Registration.signUp(mailToken).absoluteURL(IdentityProvider.sslEnabled)

这是错误日志:

[error] play - 无法调用该操作,最终出现错误:java.lang.Runt imeException:此处没有可用的HTTP上下文 . [错误]申请 - ! @ 6j0al12dk - 内部服务器错误,用于(POST)[/ signup] - > 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]正在播放 . 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] 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]引起: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]在views.core.j.PlayMagicForJava $ .requestHeader(TemplateMagicForJava.scal a:56)〜[play-java_2.10.jar:2.2.3]的views.html.custom . 在secinsocial.core.providers.utils的plugins.NekViews.getSignUpEmail(NekViews.scala:100)〜[classes /:na]中的mails.signUpEmail $ .apply(signUpEmail.template.scala:42)〜[classes /:na] .Mailer $ .sendSignUpEmail(Mailer.scal a:49)〜[securesocial_2.10-2.1.3.jar:2.1.3] [info] application - [securesocial] unloaded identity provider:userpass [info] application - [securesocial]卸载密码hasher bcrypt [info] play - 关闭应用程序默认的Akka系统 .

有谁知道错误是什么?

回答(2)

2 years ago

您的模板需要隐式请求,这是获取绝对URL所必需的 .

@(/*template's parameters*/)(implicit request: RequestHeader)

此请求必须在呈现模板的方法中可用 .

2 years ago

我有一个非常相似的错误,如果不相同,可能你也在你的项目中混合一些Java代码 .

您必须在控制器中创建一个java上下文(在本例中为自定义视图控制器),供视图使用它 .

For example:

Scala助手创建一个java上下文

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

//...
}

资料来源:dominikdorn.com