我正在尝试扩展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)
我已经从原始的
import scala.language.higherKinds
类(例如SecureAction
)中导入了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
case类的源代码复制/粘贴到我的IDE中时,我得到了完全相同的编译错误。
什么可以使此编译?它是sbt中的标志,还是我不知道的东西?
我正在尝试扩展pac4j-play模块的SecureAction,因为我希望验证一些额外的内容并将其添加到请求中,以便在控制器中轻松访问。但是我遇到了类型不匹配的问题...
您需要更改下限类型以使用您的AuthenticatedSiteRequest
,以便将一个类型参数固定到P
类的给定参数SecureSiteAction
: