【发布时间】:2017-05-01 10:53:33
【问题描述】:
我正在将现有的 Java Play 2.5 应用程序迁移到 Scala,并在视图 main.scala.html 中发现使用以下 deadbolt-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(并从 Java -> Scala 更改 deadbolt-2 依赖项)后,由于 subjectPresentOr 需要 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 版本中有效?@subjectPresentOr 的 Java 版本不需要任何隐式请求:)
为了在 Scala 版本中修复它,我将使用模式匹配包装 @subjectPresentOr 块以发现隐式请求的动态类型,并且只有当它的动态类型是 AuthenticatedRequest[_] 时,我才会显示该块并传递给 @ 987654337@ 明确表示该类型的缩小请求。虽然这不是超级优雅,但我想不出任何其他方式......
【问题讨论】:
标签: scala playframework deadbolt-2