Play 2.5 несоответствие типов Session type
Используя deadbolt2 у меня есть следующая реализация функции контроллера:
def restricted: Action = deadbolt.Restrict(List(Array(USER_ROLE)))() { request =>
Future {
val localUser = userProvider.getUser(request.session) // <<< expects a play.mvc.Http.Session
Ok(views.html.restricted(userProvider, localUser))
}
}
но это приводит к следующей ошибке компилятора:
[error] /home/bravegag/code/play-authenticate-usage-scala/app/controllers/Application.scala:26: type mismatch;
[error] found : play.api.mvc.Session
[error] required: play.mvc.Http.Session
[error] val localUser = userProvider.getUser(request.session)
[error] ^
В основном текущий request
дает мне play.api.mvc.Session
но библиотека, от которой я зависел ( play-authenticate), ожидает play.mvc.Http.Session
, Есть ли способ конвертировать между двумя? или другой способ заполучить нужный http?
1 ответ
Решение
Я нашел, как конвертировать из play.api.mvc.Session
в play.mvc.Http.Session
:
import scala.collection.JavaConversions
val session : Http.Session =
new Http.Session(JavaConversions.mapAsJavaMap(request.session.data))
хотя мне придется продолжать это переделывать везде... или писать неявный объект Helper преобразования.
ОБНОВЛЕНИЕ Определил мой собственный помощник неявного преобразования:
package utils
import scala.collection.JavaConversions
object PlayConversions {
/**
* Returns the result conversion from a play.api.mvc.Session to a play.mvc.Http.Session
* @param session play.api.mvc.Session instance
* @return the result conversion from a play.api.mvc.Session to a play.mvc.Http.Session
*/
implicit def toHttpSession(session: play.api.mvc.Session) = new play.mvc.Http.Session(JavaConversions.mapAsJavaMap(session.data))
}
ОБНОВЛЕНИЕ На самом деле это игровой / предпочтительный способ сделать это:
import play.core.j.JavaHelpers
val context = JavaHelpers.createJavaContext(request)
// and now access the Java Http.Session
context.session