Я новичок в scala, но имею некоторый опыт использования платформы воспроизведения в Java. Я добавил библиотеку аутентификации SecureSocial, которая определяет SecuredACtion, и кажется, что она работает правильно. Тем не менее, у меня возникли проблемы с пониманием ожидаемого содержимого в пользовательском действии в коде Scala.
Вот мой класс контроллеров. В идеале "индекс" просто каким-то образом перенаправляет аутентифицированный запрос на "unprotectedIndex", но это не представляется возможным. Так что если нет, то лучше всего просто обслуживать файл непосредственно из защищенного действия, но это также не работает.
Что отсутствует в моем коде?
object Application extends Controller with securesocial.core.SecureSocial {
// this doesn't compile, but it 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] - похоже, что это не должно быть сложно, но чего я не хватает?
Похоже, вы используете 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
Action
Итак, просто взглянув на подсветку синтаксиса в моей среде IDE, я смог получить что-то, что, похоже, компилируется и работает, но выглядит совершенно неправильно для меня.
Я изменил это на следующее:
def index = SecuredAction { implicit request =>
Assets.at("/public", "index.html").apply(request).value.get.get
}
Это правильный способ сделать это? Это выглядит странно для меня, я просто не знаком с идиомами?
value
в Future
которое возвращает Option[Try[T]]
где T
является универсальным (в данном случае Result
или один из его подтипов). Это может привести к NoSuchElementException
так как вы пытаетесь получить значение Future
немедленно, а не в flatMap
или в одной из его монадических функций, таких как map
или flatMap
.