既存の Java Play 2.5 アプリケーションを Scala に移行していますが、ビューmain.scala.htmlで次のデッドボルト 2クラスの使用が見つかりましたsubjectPresentOr。
@subjectPresentOr() {
<ul class="nav navbar-nav navbar-right">
@defining(userProvider.getUser(session())) { user =>
... user is present html
}
} {
... user is NOT present html
}
すべてのコントローラーとアクションを Scala に移行した後 (およびデッドボルト 2 の依存関係を Java から Scala に変更した後) subjectPresentOr、 type の暗黙の要求が必要なため、次のコンパイラ エラーが発生しAuthenticatedRequest[Any]ます。
main.scala.html:49: could not find implicit value for parameter request:
be.objectify.deadbolt.scala.AuthenticatedRequest[Any]
そして、私にはいくつかの直感があります...たとえば、ユーザーがまだログインしていない場合、deadbolt-2タイプのリクエストはありませんAuthenticatedRequest[_]が、スーパークラスタイプplay.api.mvc.RequestHeaderであり、そのサブクラスと暗黙的に一致させることはできませんAuthenticatedRequest[_]。
問題は、そもそもなぜこれが Java バージョンで機能するのかということです。の Java バージョンで@subjectPresentOrは、暗黙のリクエストは必要ありません :)
Scala バージョンでこれを修正するには、@subjectPresentOrブロックをパターン マッチングでラップして、暗黙的なリクエストの動的タイプを検出し、その動的タイプが動的タイプである場合にのみ、ブロックを表示し、そのタイプの絞り込まれたリクエストAuthenticatedRequest[_]を明示的に渡します。@subjectPresentOrこれは非常にエレガントではありませんが、他の方法はわかりません...