Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在play framework 2.1中使用scala和java:会话使用_Java_Scala_Playframework_Playframework 2.1 - Fatal编程技术网

在play framework 2.1中使用scala和java:会话使用

在play framework 2.1中使用scala和java:会话使用,java,scala,playframework,playframework-2.1,Java,Scala,Playframework,Playframework 2.1,我目前正在模板中使用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>

我目前正在模板中使用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>
}
@if(session().get(“email”)==null){
  • }否则{
  • }
    我的所有视图都使用此模板。其中一些视图由Java控制器控制,另一些视图由Scala控制器控制

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

    当我点击指向Scala控制器的链接时,我得到一个[
    RuntimeException:这里没有可用的HTTP上下文。]

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

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


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

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

      def myaction() = Action { implicit request =>
        ...
      }
    
    而不是:

      def myaction() = Action {
        ...
      }
    
    也就是说,您必须将请求添加到
    操作的范围中

    并在文件开头将其添加到视图中:

    @(...)(implicit session:Session)
    

    好的,我找到了解决这个问题的方法。 这不是真正的审美,但它的工作,并摆脱了问题完全

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

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

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

    当然,这两个模板在播放时呈现相同

    我的代码中有一些冗余,需要分离所有操作,以便视图只由一种类型的控制器(scala或java)控制


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

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

    我试图通过使用自己的ActionBuilder在ADLOCAL变量中设置自己的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()/等。

    我认为它也可以解决这个问题,而
    隐式请求
    实际上为控制器提供了在http上下文中使用数据的可能性。不幸的是,scala控制器没有使用这些数据来构建HTML页面。(当执行
    Ok(…)
    时,数据没有提供给页面,因此问题仍然存在)我还认为
    #with session
    就是为了这个,但它似乎只在构建HTML页面后返回HTTP头…正如我所说的,我不能使用这个解决方案。我使用会话对象的scala和java版本:
    play.api.mvc.Session
    play.mvc.Http.Session
    ,因为当我在模板中声明其中一个会话时,我只能在scala或java控制器中检索其中一个(java控制器返回java会话,scala控制器返回scala会话)(隐式会话:play.mvc.Http.session)
    另一个没有工作。我不能简单地放置一个
    (隐式会话:session)
    ,因为找不到对象会话。