从Play Framework中的自定义scala操作提供静态页面

时间:2014-03-17 18:55:57

标签: java scala playframework securesocial

我是scala的新手,但在Java中使用play框架方面有一些经验。我已经添加了SecureSocial身份验证库,它定义了一个SecuredACtion,它似乎正常工作。但是,我无法理解scala代码中自定义操作中的预期内容。

这是我的控制器课程。理想情况下,"索引"只需将经过身份验证的请求重定向到" unprotectedIndex"不知怎的,但这似乎不可能。因此,如果没有,那么下一个最好的事情就是直接从安全操作内部提供文件,但这也无法正常工作。

我的代码缺少什么?

object Application extends Controller with securesocial.core.SecureSocial {
  // this doesn't compile, but it's a long scala exception that I don't know how to fix.
  def index = SecuredAction { implicit request =>
    Assets.at("/public", "index.html").apply(request) 
  }

  def unprotectedIndex = Assets.at("/public", "index.html")

}

似乎它期待一个SimpleResult但是得到一个Future [SimpleResult] - 这感觉它不应该变得复杂,但是我错过了什么?

2 个答案:

答案 0 :(得分:1)

好像你正在使用play framework 2.2。有一些更改,大多数方法返回Future[SimpleResult]而不只是ResultSimpleResult。你可以检查一下你是否可以这样做:def index = SecuredAction.async {...}(但我几乎可以肯定你不能)。

您可以使用此方法使其正常工作:

import scala.concurrent.Await
import scala.concurrent.duration._

def index = SecuredAction { implicit request =>
  Await.result(Assets.at("/public", "index.html").apply(request), 5 seconds) //you can specify you maximum wait time here
}

修改

还有一件事要简化:

Await.result(unprotectedIndex(request), 5 seconds)

因此,您可以通过unprotectedIndex行动

致电index

答案 1 :(得分:0)

所以,仅仅通过查看我的IDE中的语法突出显示,我就能得到一些似乎可以编译和工作的东西,但对我来说看起来很不对。

我把它更改为:

def index = SecuredAction { implicit request =>
    Assets.at("/public", "index.html").apply(request).value.get.get
  }

这是正确的方法吗?对我来说这看起来很奇怪,我对这些习语不熟悉吗?