gpt4 book ai didi

java - 在 play framework 2.1 : Session usage 中使用 scala 和 java

转载 作者:搜寻专家 更新时间:2023-10-31 20:29:02 26 4
gpt4 key购买 nike

我目前在我的模板中使用 Play Framework 的 session() :

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

此模板用于我的所有 View 。其中一些 View 由 Java Controller 控制,而另一些则由 Scala Controller 控制。

当我点击指向 Java Controller 的链接时,我没有问题,登录和注销的链接被正确处理。

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

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

我考虑过在我的 View 、模板和 Controller 中使用参数 session(),但我相信 java session (play.mvc.http.session) 和 Play 时的scala session (play.api.mvc.session)将编译html页面。

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

最佳答案

根本原因可能是 Java Controller 和 Scala Controller 的处理方式不同。我首先在 Java 中有我的项目,然后尝试添加更多的 Scala Controller 。我也遇到了这个问题(顺便说一句,我使用的是 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 Controller 操作简单地使用这个 ContextAction:

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

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

关于java - 在 play framework 2.1 : Session usage 中使用 scala 和 java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17230010/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com