【问题标题】:pac4j-play SecureAction (extension), type mismatchpac4j-play SecureAction(扩展),类型不匹配
【发布时间】:2020-01-31 07:14:50
【问题描述】:

我正在尝试扩展 pac4j-play 模块的 SecureAction,因为我想要验证一些额外的内容并将其添加到请求中,以便在控制器中轻松访问。

但我遇到了类型不匹配的编译问题,我似乎无法理解原因。

class SecureSiteAction[P<:CommonProfile, ContentType, R[X]>:AuthenticatedRequest[P, X]<:Request[X]](clients: String, authorizers: String, matchers: String, multiProfile: Boolean, parser: BodyParser[ContentType], playSessionStore: PlaySessionStore, config: Config)(implicit implicitExecutionContext: ExecutionContext)
  extends SecureAction[P, ContentType, R](clients, authorizers, matchers, multiProfile, parser, playSessionStore, config) {

  override def invokeBlock[A](request: Request[A], block: R[A] => Future[Result]): Future[Result] = {
    super.invokeBlock(request, { request: R[A] =>
      val site = Site(request.host)
      val profiles = request.asInstanceOf[AuthenticatedRequest[P, A]].profiles
      block(AuthenticatedSiteRequest(site, profiles, request))
    })
  }
}

case class AuthenticatedSiteRequest[P<:CommonProfile, +A](site: Site, profiles: List[P], request: Request[A]) extends WrappedRequest[A](request)

我已经从原始 SecureAction 类中导入了 import scala.language.higherKinds 之类的内容(请参阅 https://github.com/pac4j/play-pac4j/blob/master/shared/src/main/scala/org/pac4j/play/scala/Security.scala)。

下面一行是问题:

block(AuthenticatedSiteRequest(site, profiles, request))

给出类型错误:

type mismatch;
[error]  found   : binders.AuthenticatedSiteRequest[P,A]
[error]  required: R[A]
[error]       block(AuthenticatedSiteRequest(site, profiles, request))

“有趣”的是,当我直接从 pac4j-play 的 SecureAction 案例类复制/粘贴源代码到我的 IDE 中时,我得到了完全相同的编译错误。

什么可以编译?它是 sbt 中的标志,还是我不知道的东西?

【问题讨论】:

    标签: scala playframework sbt type-mismatch pac4j


    【解决方案1】:

    您需要更改下限类型以使用您的AuthenticatedSiteRequest,以便将一个类型参数固定到SecureSiteAction 类的给定参数P

    class SecureSiteAction[
        P <: CommonProfile, ContentType,
        R[X] >: AuthenticatedSiteRequest[P, X] <: Request[X]
      ] //      ^^^^^^^^^^^^^^^^^^^^^^^^ 
    

    “有趣”的是,当我直接从 pac4j-play 的 SecureAction 案例类复制/粘贴源代码到我的 IDE 中时,我得到完全相同的编译错误。

    这似乎是您的 IDE 的问题,可能是 IntelliJ?

    【讨论】:

    • 我也试过了,还是不行。我的 IDE 和 SBT 都对该类型提出了投诉。
    • 也许还有其他一些不明显的区别。尝试制作reprex
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 2017-04-10
    • 2022-07-21
    • 1970-01-01
    相关资源
    最近更新 更多