1

既存の 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これは非常にエレガントではありませんが、他の方法はわかりません...

4

1 に答える 1