0

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ます。2つを変換する方法はありますか?または、必要な Http を取得する別の方法はありますか?

4

1 に答える 1

0

から に変換する方法を見つけましplay.api.mvc.Sessionplay.mvc.Http.Session

import scala.collection.JavaConversions

val session : Http.Session = 
    new Http.Session(JavaConversions.mapAsJavaMap(request.session.data))

どこでもこれをやり直す必要がありますが...または暗黙の変換ヘルパーオブジェクトを作成します。

更新私自身の暗黙的な変換ヘルパーを定義しました:

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))
}

更新実際、これは Play の制度的/推奨される方法です。

import play.core.j.JavaHelpers

val context = JavaHelpers.createJavaContext(request)
// and now access the Java Http.Session
context.session
于 2016-12-09T20:38:08.367 に答える