Обслуживание статической страницы из пользовательского действия scala в Play Framework

1

Я новичок в 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] - похоже, что это не должно быть сложно, но чего я не хватает?

Теги:
playframework
securesocial

2 ответа

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 Action

  • 0
    Хорошо, спасибо. Это имеет гораздо больше смысла, чем .value.get.get, как я обнаружил.
  • 0
    Итак, на самом деле SecuredAction.async работал просто отлично. Он принял будущее в блоке, вместо того, чтобы делать какие-либо вызовы Await или что-то еще. Отлично.
Показать ещё 2 комментария
0

Итак, просто взглянув на подсветку синтаксиса в моей среде IDE, я смог получить что-то, что, похоже, компилируется и работает, но выглядит совершенно неправильно для меня.

Я изменил это на следующее:

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

Это правильный способ сделать это? Это выглядит странно для меня, я просто не знаком с идиомами?

  • 0
    Вы вызываете value в Future которое возвращает Option[Try[T]] где T является универсальным (в данном случае Result или один из его подтипов). Это может привести к NoSuchElementException так как вы пытаетесь получить значение Future немедленно, а не в flatMap или в одной из его монадических функций, таких как map или flatMap .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню