pac4j-play SecureAction (расширение), несоответствие типов - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь расширить SecureAction модуля pac4j-play, потому что я хочу, чтобы некоторые дополнительные вещи были проверены и добавлены в запрос для легкого доступа в контроллере.

Но я сталкиваюсь с типом -проверка проблемы компиляции, и я не могу, кажется, gr asp почему.

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))

«Забавно» то, что что когда я копирую / вставляю исходный код непосредственно из класса SecureAction класса pac4j-play в мою среду IDE, я получаю точно такую ​​же ошибку компиляции.

Что может сделать эту компиляцию? Это флаг в sbt или что-то, о чем я не знаю?

1 Ответ

0 голосов
/ 03 февраля 2020

Вам нужно изменить нижнюю границу типа, чтобы использовать AuthenticatedSiteRequest, чтобы привязать параметр одного типа к данному параметру P класса SecureSiteAction:

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

Самое смешное, что когда я копирую / вставляю исходный код непосредственно из класса дел SecureAction pac4j-play в мою IDE, я получаю точно такую ​​же ошибку компиляции.

Это похоже на проблема вашей IDE, вероятно IntelliJ?

...