pac4j-play SecureAction (расширение), несоответствие типов
Я пытаюсь расширить SecureAction модуля pac4j-play, потому что я хочу, чтобы некоторые дополнительные данные были проверены и добавлены в запрос для облегчения доступа в контроллере.
Но я столкнулся с проблемой компиляции несоответствия типов, и я не могу понять, почему.
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 или что-то, о чем я не знаю?
1 ответ
Вам нужно изменить нижнюю границу типа, чтобы использовать ваш AuthenticatedSiteRequest
чтобы привязать параметр одного типа к данному параметру P
из SecureSiteAction
класс:
class SecureSiteAction[
P <: CommonProfile, ContentType,
R[X] >: AuthenticatedSiteRequest[P, X] <: Request[X]
] // ^^^^^^^^^^^^^^^^^^^^^^^^
"Забавно" то, что когда я копирую / вставляю исходный код непосредственно из класса case SecureAction pac4j-play в свою IDE, я получаю точно такую же ошибку компиляции.
Кажется, это проблема вашей IDE, возможно, IntelliJ?