5

我目前session()在我的模板中使用 of play 框架:

@if(session().get("email")==null){
    <li><a href="@controllers.routes.General.login">Login</a></li>
}else{
    <li><a href="@controllers.routes.General.logout">Logout</a></li>
}

我的所有观点都使用了这个模板。其中一些视图由 Java 控制器控制,而另一些则由 Scala 控制器控制。

当我单击指向 Java 控制器的链接时,我没有任何问题,登录和注销的链接得到了正确处理。

当我单击指向 Scala 控制器的链接时,我得到一个 [RuntimeException: There is no HTTP Context available from here.]

从我在这里读到的关于 scala 控制器的内容中,我了解到它们在呈现页面时没有返回 http 上下文,但我真的希望能够在我的模板中使用会话。

我想过session()在我的视图、模板和控制器中使用一个参数,但我相信java会话(play.mvc.http.session)和scala会话(play.api.mvc.session)之间会有冲突play 将编译 html 页面。

我卡住了吗?是否有可能强制 scala 控制器返回 http 上下文?

4

3 回答 3

2

根本原因可能是 Java 控制器和 Scala 控制器的处理方式不同。我的项目首先是 Java,然后尝试添加更多的 Scala 控制器。我也遇到了这个问题(顺便说一句,我使用的是 Play 2.3.2)。

我试图通过使用我自己的 ActionBuilder 在 TheadLocal 变量中设置我自己的 Http.Context 来解决这个问题。

import play.api.mvc._
import scala.concurrent.Future
import play.mvc.Http.Context
import play.core.j.JavaHelpers

object ContextAction extends ActionBuilder[Request] {

  def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) = {
    Context.current.set(JavaHelpers.createJavaContext(request))
    block(request)
  }
}

然后我的 Scala 控制器操作只需使用这个 ContextAction 代替:

class TestController extends Controller {
  def test = ContextAction { implicit request =>
    Ok(views.html.index())
  }
}

这样索引模板可以访问所有 request() / session() / etc。

于 2014-07-23T04:10:32.910 回答
0

我可能错了,但我认为您的 Scala 控制器应该如下所示:

  def myaction() = Action { implicit request =>
    ...
  }

代替:

  def myaction() = Action {
    ...
  }

即,您必须将请求添加到您的Action.

并将它也添加到您的视图中,在文件的开头:

@(...)(implicit session:Session)
于 2013-06-21T09:47:33.533 回答
0

好的,我找到了解决此问题的方法。这不是真正的美学,但它有效,并且完全摆脱了这个问题。

我创建了两个不同的主模板:scalamain.scala.htmljavamain.scala.html

scalamain由 Scala 控制器控制的所有视图都使用该模板,并使用通常的技巧来使用会话(隐式参数,请参阅此处的更多信息)。

javamain由 Java 控制器控制的所有视图都使用该模板。(这些视图很容易使用会话)。

这两个模板当然是相同的,一旦被 play 渲染。

我最终在我的代码中出现了一些冗余,并且需要将所有操作分开,以便视图仅由一种类型的控制器(scala 或 java)控制。

我希望这会帮助其他有同样问题的人。我验证这个答案,因为它解决了问题,但如果你找到更优雅的方法来解决它,请随时回答。

于 2013-06-25T13:19:35.050 回答