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

时间:2014-07-18 14:57:56

标签: java http playframework-2.0 absolute-path securesocial

我在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)[/注册] - >

     

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系统。

有人知道错误是什么吗?

2 个答案:

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

//...
}

来源:dominikdorn.com