我是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] - 这感觉它不应该变得复杂,但是我错过了什么?
答案 0 :(得分:1)
好像你正在使用play framework 2.2。有一些更改,大多数方法返回Future[SimpleResult]
而不只是Result
或SimpleResult
。你可以检查一下你是否可以这样做: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
}
这是正确的方法吗?对我来说这看起来很奇怪,我对这些习语不熟悉吗?