pac4j / play-pac4j

Security library for Play framework 2 in Java and Scala: OAuth, CAS, SAML, OpenID Connect, LDAP, JWT...
http://www.pac4j.org
Apache License 2.0
404 stars 101 forks source link

play-pac4j-scala-demo is not Scala3 compatible #686

Closed JulienSt closed 1 month ago

JulienSt commented 1 month ago

I wanted to try out the demo with the newest versions and it does not work, as it throws runtime errors.

When running the following config:

scalaVersion := "2.13.14"

val playPac4jVersion = "12.0.0-PLAY3.0"
val pac4jVersion = "6.0.5"
val playVersion = "3.0.5"

Everything works fine, but as soon as the ScalaVersion ticks over to 3, I get the following errors:

[IJ][play-pac4j-scala-demo] $ run

--- (Running the application, auto-reloading is enabled) ---

INFO  p.c.s.PekkoHttpServer - Listening for HTTP on /[0:0:0:0:0:0:0:0]:9000

(Server started, use Enter to stop and go back to the console...)

[info] compiling 27 Scala sources and 3 Java sources to [...]/play-pac4j-scala-demo-master/target/scala-3.3.3/classes ...
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:32:14 
[error] 32 |  def index = Secure("AnonymousClient") { implicit request =>
[error]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^
[error]    |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]    | (block: Application.this.AuthenticatedRequest[play.api.mvc.AnyContent] =>
[error]    |  play.api.mvc.Result): play.api.mvc.Action[play.api.mvc.AnyContent]
[error]    | [A]
[error]    |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]    |    play.api.mvc.ActionBuilder[Application.this.AuthenticatedRequest, A]
[error]    |both match arguments (<?> => <?>)
[error]    |
[error]    | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:42:18 
[error] 42 |  def csrfIndex = Secure("AnonymousClient", "csrfCheck") { implicit request =>
[error]    |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[error]    |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]    | (block: Application.this.AuthenticatedRequest[play.api.mvc.AnyContent] =>
[error]    |  play.api.mvc.Result): play.api.mvc.Action[play.api.mvc.AnyContent]
[error]    | [A]
[error]    |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]    |    play.api.mvc.ActionBuilder[Application.this.AuthenticatedRequest, A]
[error]    |both match arguments (<?> => <?>)
[error]    |
[error]    | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:47:22 
[error] 47 |  def facebookIndex = Action { implicit request =>
[error]    |                      ^^^^^^
[error]    |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]    | (block: play.api.mvc.Request[play.api.mvc.AnyContent] => play.api.mvc.Result):
[error]    |  play.api.mvc.Action[play.api.mvc.AnyContent]
[error]    | [A]
[error]    |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]    |    play.api.mvc.ActionBuilder[play.api.mvc.Request, A]
[error]    |both match arguments (<?> => <?>)
[error]    |
[error]    | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:51:27 
[error] 51 |  def facebookAdminIndex = Secure("FacebookClient", "admin") { implicit request =>
[error]    |                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[error]    |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]    | (block: Application.this.AuthenticatedRequest[play.api.mvc.AnyContent] =>
[error]    |  play.api.mvc.Result): play.api.mvc.Action[play.api.mvc.AnyContent]
[error]    | [A]
[error]    |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]    |    play.api.mvc.ActionBuilder[Application.this.AuthenticatedRequest, A]
[error]    |both match arguments (<?> => <?>)
[error]    |
[error]    | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:55:28 
[error] 55 |  def facebookCustomIndex = Secure("FacebookClient", "custom") { implicit request =>
[error]    |                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[error]    |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]    | (block: Application.this.AuthenticatedRequest[play.api.mvc.AnyContent] =>
[error]    |  play.api.mvc.Result): play.api.mvc.Action[play.api.mvc.AnyContent]
[error]    | [A]
[error]    |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]    |    play.api.mvc.ActionBuilder[Application.this.AuthenticatedRequest, A]
[error]    |both match arguments (<?> => <?>)
[error]    |
[error]    | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:59:34 
[error] 59 |  def facebookNotProtectedIndex = Action { request =>
[error]    |                                  ^^^^^^
[error]    |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]    | (block: play.api.mvc.Request[play.api.mvc.AnyContent] => play.api.mvc.Result):
[error]    |  play.api.mvc.Action[play.api.mvc.AnyContent]
[error]    | [A]
[error]    |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]    |    play.api.mvc.ActionBuilder[play.api.mvc.Request, A]
[error]    |both match arguments (<?> => <?>)
[error]    |
[error]    | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:63:21 
[error] 63 |  def twitterIndex = Secure("TwitterClient,FacebookClient") { implicit request =>
[error]    |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[error]    |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]    | (block: Application.this.AuthenticatedRequest[play.api.mvc.AnyContent] =>
[error]    |  play.api.mvc.Result): play.api.mvc.Action[play.api.mvc.AnyContent]
[error]    | [A]
[error]    |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]    |    play.api.mvc.ActionBuilder[Application.this.AuthenticatedRequest, A]
[error]    |both match arguments (<?> => <?>)
[error]    |
[error]    | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:67:23 
[error] 67 |  def protectedIndex = Secure { implicit request =>
[error]    |                       ^^^^^^
[error]    |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]    | (block: Application.this.AuthenticatedRequest[play.api.mvc.AnyContent] =>
[error]    |  play.api.mvc.Result): play.api.mvc.Action[play.api.mvc.AnyContent]
[error]    | [A]
[error]    |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]    |    play.api.mvc.ActionBuilder[Application.this.AuthenticatedRequest, A]
[error]    |both match arguments (<?> => <?>)
[error]    |
[error]    | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:71:29 
[error] 71 |  def protectedCustomIndex = Secure(authorizers="custom") { implicit request =>
[error]    |                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[error]    |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]    | (block: Application.this.AuthenticatedRequest[play.api.mvc.AnyContent] =>
[error]    |  play.api.mvc.Result): play.api.mvc.Action[play.api.mvc.AnyContent]
[error]    | [A]
[error]    |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]    |    play.api.mvc.ActionBuilder[Application.this.AuthenticatedRequest, A]
[error]    |both match arguments (<?> => <?>)
[error]    |
[error]    | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:75:18 
[error] 75 |  def formIndex = Secure("FormClient") { implicit request =>
[error]    |                  ^^^^^^^^^^^^^^^^^^^^
[error]    |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]    | (block: Application.this.AuthenticatedRequest[play.api.mvc.AnyContent] =>
[error]    |  play.api.mvc.Result): play.api.mvc.Action[play.api.mvc.AnyContent]
[error]    | [A]
[error]    |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]    |    play.api.mvc.ActionBuilder[Application.this.AuthenticatedRequest, A]
[error]    |both match arguments (<?> => <?>)
[error]    |
[error]    | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:81:22 
[error] 81 |  def formIndexJson = Secure("FormClient") { implicit request =>
[error]    |                      ^^^^^^^^^^^^^^^^^^^^
[error]    |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]    | (block: Application.this.AuthenticatedRequest[play.api.mvc.AnyContent] =>
[error]    |  play.api.mvc.Result): play.api.mvc.Action[play.api.mvc.AnyContent]
[error]    | [A]
[error]    |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]    |    play.api.mvc.ActionBuilder[Application.this.AuthenticatedRequest, A]
[error]    |both match arguments (<?> => <?>)
[error]    |
[error]    | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:87:23 
[error] 87 |  def basicauthIndex = Secure("IndirectBasicAuthClient") { implicit request =>
[error]    |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[error]    |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]    | (block: Application.this.AuthenticatedRequest[play.api.mvc.AnyContent] =>
[error]    |  play.api.mvc.Result): play.api.mvc.Action[play.api.mvc.AnyContent]
[error]    | [A]
[error]    |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]    |    play.api.mvc.ActionBuilder[Application.this.AuthenticatedRequest, A]
[error]    |both match arguments (<?> => <?>)
[error]    |
[error]    | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:91:17 
[error] 91 |  def dbaIndex = Secure("DirectBasicAuthClient,ParameterClient") { implicit request =>
[error]    |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[error]    |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]    | (block: Application.this.AuthenticatedRequest[play.api.mvc.AnyContent] =>
[error]    |  play.api.mvc.Result): play.api.mvc.Action[play.api.mvc.AnyContent]
[error]    | [A]
[error]    |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]    |    play.api.mvc.ActionBuilder[Application.this.AuthenticatedRequest, A]
[error]    |both match arguments (<?> => <?>)
[error]    |
[error]    | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:95:17 
[error] 95 |  def casIndex = Secure("CasClient") { implicit request =>
[error]    |                 ^^^^^^^^^^^^^^^^^^^
[error]    |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]    | (block: Application.this.AuthenticatedRequest[play.api.mvc.AnyContent] =>
[error]    |  play.api.mvc.Result): play.api.mvc.Action[play.api.mvc.AnyContent]
[error]    | [A]
[error]    |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]    |    play.api.mvc.ActionBuilder[Application.this.AuthenticatedRequest, A]
[error]    |both match arguments (<?> => <?>)
[error]    |
[error]    | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:107:18 
[error] 107 |  def samlIndex = Secure("SAML2Client") { implicit request =>
[error]     |                  ^^^^^^^^^^^^^^^^^^^^^
[error]     |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]     | (block: Application.this.AuthenticatedRequest[play.api.mvc.AnyContent] =>
[error]     |  play.api.mvc.Result): play.api.mvc.Action[play.api.mvc.AnyContent]
[error]     | [A]
[error]     |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]     |    play.api.mvc.ActionBuilder[Application.this.AuthenticatedRequest, A]
[error]     |both match arguments (<?> => <?>)
[error]     |
[error]     | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:111:18 
[error] 111 |  def oidcIndex = Secure("OidcClient") { implicit request =>
[error]     |                  ^^^^^^^^^^^^^^^^^^^^
[error]     |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]     | (block: Application.this.AuthenticatedRequest[play.api.mvc.AnyContent] =>
[error]     |  play.api.mvc.Result): play.api.mvc.Action[play.api.mvc.AnyContent]
[error]     | [A]
[error]     |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]     |    play.api.mvc.ActionBuilder[Application.this.AuthenticatedRequest, A]
[error]     |both match arguments (<?> => <?>)
[error]     |
[error]     | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:116:21 
[error] 116 |  def restJwtIndex = Action { implicit request =>
[error]     |                     ^^^^^^
[error]     |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]     | (block: play.api.mvc.Request[play.api.mvc.AnyContent] => play.api.mvc.Result):
[error]     |  play.api.mvc.Action[play.api.mvc.AnyContent]
[error]     | [A]
[error]     |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]     |    play.api.mvc.ActionBuilder[play.api.mvc.Request, A]
[error]     |both match arguments (<?> => <?>)
[error]     |
[error]     | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:120:18 
[error] 120 |  def loginForm = Action { request =>
[error]     |                  ^^^^^^
[error]     |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]     | (block: play.api.mvc.Request[play.api.mvc.AnyContent] => play.api.mvc.Result):
[error]     |  play.api.mvc.Action[play.api.mvc.AnyContent]
[error]     | [A]
[error]     |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]     |    play.api.mvc.ActionBuilder[play.api.mvc.Request, A]
[error]     |both match arguments (<?> => <?>)
[error]     |
[error]     | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:125:12 
[error] 125 |  def jwt = Action { request =>
[error]     |            ^^^^^^
[error]     |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]     | (block: play.api.mvc.Request[play.api.mvc.AnyContent] => play.api.mvc.Result):
[error]     |  play.api.mvc.Action[play.api.mvc.AnyContent]
[error]     | [A]
[error]     |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]     |    play.api.mvc.ActionBuilder[play.api.mvc.Request, A]
[error]     |both match arguments (<?> => <?>)
[error]     |
[error]     | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/Application.scala:135:19 
[error] 135 |  def forceLogin = Action { request =>
[error]     |                   ^^^^^^
[error]     |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]     | (block: play.api.mvc.Request[play.api.mvc.AnyContent] => play.api.mvc.Result):
[error]     |  play.api.mvc.Action[play.api.mvc.AnyContent]
[error]     | [A]
[error]     |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]     |    play.api.mvc.ActionBuilder[play.api.mvc.Request, A]
[error]     |both match arguments (<?> => <?>)
[error]     |
[error]     | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/ApplicationWithScalaHelper.scala:12:14 
[error] 12 |  def index = Secure("AnonymousClient", "csrfToken") { implicit request =>
[error]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[error]    |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]    | (block:
[error]    |  ApplicationWithScalaHelper.this.AuthenticatedRequest[play.api.mvc.AnyContent]
[error]    |  => play.api.mvc.Result): play.api.mvc.Action[play.api.mvc.AnyContent]
[error]    | [A]
[error]    |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]    |    play.api.mvc.ActionBuilder[
[error]    |      ApplicationWithScalaHelper.this.AuthenticatedRequest, A]
[error]    |both match arguments (<?> => <?>)
[error]    |
[error]    | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/ApplicationWithScalaHelper.scala:21:17 
[error] 21 |  def userView = Secure("FormClient") { implicit request =>
[error]    |                 ^^^^^^^^^^^^^^^^^^^^
[error]    |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]    | (block:
[error]    |  ApplicationWithScalaHelper.this.AuthenticatedRequest[play.api.mvc.AnyContent]
[error]    |  => play.api.mvc.Result): play.api.mvc.Action[play.api.mvc.AnyContent]
[error]    | [A]
[error]    |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]    |    play.api.mvc.ActionBuilder[
[error]    |      ApplicationWithScalaHelper.this.AuthenticatedRequest, A]
[error]    |both match arguments (<?> => <?>)
[error]    |
[error]    | longer explanation available when compiling with `-explain`
[error] -- [E051] Reference Error: [...]/play-pac4j-scala-demo-master/app/controllers/ApplicationWithScalaHelper.scala:26:18 
[error] 26 |  def loginForm = Action { implicit request =>
[error]    |                  ^^^^^^
[error]    |Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
[error]    | (block: play.api.mvc.Request[play.api.mvc.AnyContent] => play.api.mvc.Result):
[error]    |  play.api.mvc.Action[play.api.mvc.AnyContent]
[error]    | [A]
[error]    |  (bodyParser: play.api.mvc.BodyParser[A]):
[error]    |    play.api.mvc.ActionBuilder[play.api.mvc.Request, A]
[error]    |both match arguments (<?> => <?>)
[error]    |
[error]    | longer explanation available when compiling with `-explain`
[error] 23 errors found
[error] (Compile / compileIncremental) Compilation failed
ERROR p.a.h.DevHttpErrorHandler - 

! @86bj2n707 - Internal server error, for (GET) [/] ->

play.sbt.PlayExceptions$CompilationException: Compilation error[Ambiguous overload. The overloaded alternatives of method apply in trait ActionBuilder with types
 (block: Application.this.AuthenticatedRequest[play.api.mvc.AnyContent] =>
  play.api.mvc.Result): play.api.mvc.Action[play.api.mvc.AnyContent]
 [A]
  (bodyParser: play.api.mvc.BodyParser[A]):
    play.api.mvc.ActionBuilder[Application.this.AuthenticatedRequest, A]
both match arguments (<?> => <?>)]
    at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:28)
    at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:28)
    at scala.Option.map(Option.scala:230)
    at play.sbt.run.PlayReload$.$anonfun$taskFailureHandler$8(PlayReload.scala:119)
    at scala.Option.map(Option.scala:230)
    at play.sbt.run.PlayReload$.taskFailureHandler(PlayReload.scala:92)
    at play.sbt.run.PlayReload$.$anonfun$compile$3(PlayReload.scala:144)
    at scala.util.Either$LeftProjection.map(Either.scala:573)
    at play.sbt.run.PlayReload$.compile(PlayReload.scala:144)
    at sbt.PlayRun$.$anonfun$playRunTask$5(PlayRun.scala:99)
rayacode commented 1 month ago

did you changed scala version in build file?

JulienSt commented 1 month ago

Yes, the small code excerpt at the top is from the build.sbt

JulienSt commented 1 month ago

I can get the compilation to work with version 3, when I add the type to methods like so:

def facebookAdminIndex: Action[AnyContent] = ...

But then I get the following error when navigating to localhost:9000

[IJ][play-pac4j-scala-demo] $ run

--- (Running the application, auto-reloading is enabled) ---

INFO  p.c.s.PekkoHttpServer - Listening for HTTP on /[0:0:0:0:0:0:0:0]:9000

(Server started, use Enter to stop and go back to the console...)

INFO  p.a.h.HttpErrorHandlerExceptions - Registering exception handler: guice-provision-exception-handler
[info] - org.pac4j.core.adapter.FrameworkAdapter - Using Play framework adapter
[warn] - org.pac4j.core.client.direct.AnonymousClient - Be careful when using the 'AnonymousClient': an 'AnonymousProfile' is returned and the access is granted for the request.
[warn] - org.pac4j.core.matching.matcher.PathMatcher - Be careful when using the 'excludeBranch' or 'excludeRegex' methods. They use regular expressions and their definitions may be error prone. You could exclude more URLs than expected.
@86bofno21: Execution exception[[NoSuchMethodError: 'void play.api.mvc.EssentialFilter.$init$(play.api.mvc.EssentialFilter)']]
    at play.api.http.HttpErrorHandlerExceptions$.convertToPlayException$$anonfun$3(HttpErrorHandler.scala:407)
    at scala.Option.getOrElse(Option.scala:201)
    at play.api.http.HttpErrorHandlerExceptions$.convertToPlayException(HttpErrorHandler.scala:407)
    at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:390)
    at play.core.server.DevServerStart$DevServerApplicationProvider$1.reload(DevServerStart.scala:265)
    at play.core.server.DevServerStart$DevServerApplicationProvider$1.get(DevServerStart.scala:190)
    at play.core.server.PekkoHttpServer.handleRequest(PekkoHttpServer.scala:320)
    at play.core.server.PekkoHttpServer.$anonfun$3(PekkoHttpServer.scala:224)
    at org.apache.pekko.stream.impl.fusing.MapAsyncUnordered$$anon$31.onPush(Ops.scala:1443)
    at org.apache.pekko.stream.impl.fusing.GraphInterpreter.processPush(GraphInterpreter.scala:555)
    at org.apache.pekko.stream.impl.fusing.GraphInterpreter.processEvent(GraphInterpreter.scala:506)
    at org.apache.pekko.stream.impl.fusing.GraphInterpreter.execute(GraphInterpreter.scala:400)
    at org.apache.pekko.stream.impl.fusing.GraphInterpreterShell.runBatch(ActorGraphInterpreter.scala:662)
    at org.apache.pekko.stream.impl.fusing.GraphInterpreterShell$AsyncInput.execute(ActorGraphInterpreter.scala:532)
    at org.apache.pekko.stream.impl.fusing.GraphInterpreterShell.processEvent(ActorGraphInterpreter.scala:637)
    at org.apache.pekko.stream.impl.fusing.ActorGraphInterpreter.org$apache$pekko$stream$impl$fusing$ActorGraphInterpreter$$processEvent(ActorGraphInterpreter.scala:813)
    at org.apache.pekko.stream.impl.fusing.ActorGraphInterpreter$$anon$2.applyOrElse(ActorGraphInterpreter.scala:831)
    at org.apache.pekko.actor.Actor.aroundReceive(Actor.scala:547)
    at org.apache.pekko.actor.Actor.aroundReceive$(Actor.scala:481)
    at org.apache.pekko.stream.impl.fusing.ActorGraphInterpreter.aroundReceive(ActorGraphInterpreter.scala:729)
    at org.apache.pekko.actor.ActorCell.receiveMessage(ActorCell.scala:590)
    at org.apache.pekko.actor.ActorCell.invoke(ActorCell.scala:557)
    at org.apache.pekko.dispatch.Mailbox.processMailbox(Mailbox.scala:280)
    at org.apache.pekko.dispatch.Mailbox.run(Mailbox.scala:241)
    at org.apache.pekko.dispatch.Mailbox.exec(Mailbox.scala:253)
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
    at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312)
    at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843)
    at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808)
    at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188)
Caused by: java.lang.NoSuchMethodError: 'void play.api.mvc.EssentialFilter.$init$(play.api.mvc.EssentialFilter)'
    at org.pac4j.play.filters.SecurityFilter.<init>(SecurityFilter.scala:63)
    at org.pac4j.play.filters.SecurityFilter$$FastClassByGuice$$1688d51.GUICE$TRAMPOLINE(<generated>)
    at org.pac4j.play.filters.SecurityFilter$$FastClassByGuice$$1688d51.apply(<generated>)
    at com.google.inject.internal.DefaultConstructionProxyFactory$FastClassProxy.newInstance(DefaultConstructionProxyFactory.java:82)
    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:114)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:300)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
    at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:169)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:45)
    at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:40)
    at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:60)
    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:113)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:300)
    at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:60)
    at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:40)
    at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:60)
    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:113)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:300)
    at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:60)
    at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:40)
    at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:60)
    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:113)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:300)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
    at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:169)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:45)
    at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:60)
    at com.google.inject.internal.InjectorImpl$1.get(InjectorImpl.java:1148)
    at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1186)
    at play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:434)
    at play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:429)
    at play.api.inject.ContextClassLoaderInjector.instanceOf$$anonfun$2(Injector.scala:118)
    at play.api.inject.ContextClassLoaderInjector.withContext(Injector.scala:127)
    at play.api.inject.ContextClassLoaderInjector.instanceOf(Injector.scala:118)
    at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:176)
    at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21)
    at play.core.server.DevServerStart$DevServerApplicationProvider$1.$anonfun$1(DevServerStart.scala:233)
    at play.utils.Threads$.withContextClassLoader(Threads.scala:22)
    at play.core.server.DevServerStart$DevServerApplicationProvider$1.reload(DevServerStart.scala:234)
    ... 25 more

Stacktrace caused by project play-pac4j-scala-demo-master (filesystem path to project is [...]/play-pac4j-scala-demo-master).

[error] - play.api.http.DevHttpErrorHandler - 

! @86bofno21 - Internal server error, for (GET) [/] ->

play.api.PlayException: Execution exception[[NoSuchMethodError: 'void play.api.mvc.EssentialFilter.$init$(play.api.mvc.EssentialFilter)']]
    at play.api.http.HttpErrorHandlerExceptions$.convertToPlayException$$anonfun$3(HttpErrorHandler.scala:407)
    at scala.Option.getOrElse(Option.scala:201)
    at play.api.http.HttpErrorHandlerExceptions$.convertToPlayException(HttpErrorHandler.scala:407)
    at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:390)
    at play.core.server.DevServerStart$DevServerApplicationProvider$1.reload(DevServerStart.scala:265)
    at play.core.server.DevServerStart$DevServerApplicationProvider$1.get(DevServerStart.scala:190)
    at play.core.server.PekkoHttpServer.handleRequest(PekkoHttpServer.scala:320)
    at play.core.server.PekkoHttpServer.$anonfun$3(PekkoHttpServer.scala:224)
    at org.apache.pekko.stream.impl.fusing.MapAsyncUnordered$$anon$31.onPush(Ops.scala:1443)
    at org.apache.pekko.stream.impl.fusing.GraphInterpreter.processPush(GraphInterpreter.scala:555)
    at org.apache.pekko.stream.impl.fusing.GraphInterpreter.processEvent(GraphInterpreter.scala:506)
    at org.apache.pekko.stream.impl.fusing.GraphInterpreter.execute(GraphInterpreter.scala:400)
    at org.apache.pekko.stream.impl.fusing.GraphInterpreterShell.runBatch(ActorGraphInterpreter.scala:662)
    at org.apache.pekko.stream.impl.fusing.GraphInterpreterShell$AsyncInput.execute(ActorGraphInterpreter.scala:532)
    at org.apache.pekko.stream.impl.fusing.GraphInterpreterShell.processEvent(ActorGraphInterpreter.scala:637)
    at org.apache.pekko.stream.impl.fusing.ActorGraphInterpreter.org$apache$pekko$stream$impl$fusing$ActorGraphInterpreter$$processEvent(ActorGraphInterpreter.scala:813)
    at org.apache.pekko.stream.impl.fusing.ActorGraphInterpreter$$anon$2.applyOrElse(ActorGraphInterpreter.scala:831)
    at org.apache.pekko.actor.Actor.aroundReceive(Actor.scala:547)
    at org.apache.pekko.actor.Actor.aroundReceive$(Actor.scala:481)
    at org.apache.pekko.stream.impl.fusing.ActorGraphInterpreter.aroundReceive(ActorGraphInterpreter.scala:729)
    at org.apache.pekko.actor.ActorCell.receiveMessage(ActorCell.scala:590)
    at org.apache.pekko.actor.ActorCell.invoke(ActorCell.scala:557)
    at org.apache.pekko.dispatch.Mailbox.processMailbox(Mailbox.scala:280)
    at org.apache.pekko.dispatch.Mailbox.run(Mailbox.scala:241)
    at org.apache.pekko.dispatch.Mailbox.exec(Mailbox.scala:253)
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
    at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312)
    at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843)
    at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808)
    at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188)
Caused by: java.lang.NoSuchMethodError: 'void play.api.mvc.EssentialFilter.$init$(play.api.mvc.EssentialFilter)'
    at org.pac4j.play.filters.SecurityFilter.<init>(SecurityFilter.scala:63)
    at org.pac4j.play.filters.SecurityFilter$$FastClassByGuice$$1688d51.GUICE$TRAMPOLINE(<generated>)
    at org.pac4j.play.filters.SecurityFilter$$FastClassByGuice$$1688d51.apply(<generated>)
    at com.google.inject.internal.DefaultConstructionProxyFactory$FastClassProxy.newInstance(DefaultConstructionProxyFactory.java:82)
    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:114)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:300)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
    at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:169)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:45)
    at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:40)
    at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:60)
    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:113)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:300)
    at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:60)
    at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:40)
    at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:60)
    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:113)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:300)
    at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:60)
    at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:40)
    at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:60)
    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:113)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:300)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
    at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:169)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:45)
    at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:60)
    at com.google.inject.internal.InjectorImpl$1.get(InjectorImpl.java:1148)
    at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1186)
    at play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:434)
    at play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:429)
    at play.api.inject.ContextClassLoaderInjector.instanceOf$$anonfun$2(Injector.scala:118)
    at play.api.inject.ContextClassLoaderInjector.withContext(Injector.scala:127)
    at play.api.inject.ContextClassLoaderInjector.instanceOf(Injector.scala:118)
    at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:176)
    at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21)
    at play.core.server.DevServerStart$DevServerApplicationProvider$1.$anonfun$1(DevServerStart.scala:233)
    at play.utils.Threads$.withContextClassLoader(Threads.scala:22)
    at play.core.server.DevServerStart$DevServerApplicationProvider$1.reload(DevServerStart.scala:234)
    ... 25 common frames omitted

As a reminder everything works on my end, when using the example as is or ever after updating everything else except the scala version

leleuj commented 1 month ago

java.lang.NoSuchMethodError: 'void play.api.mvc.EssentialFilter.$init$(play.api.mvc.EssentialFilter)': it looks like we don't have the right play library versions, do we?

JulienSt commented 1 month ago

That might be the case. If I am interpreting things right, the root pom.xml defines the scala version as

<scala.version>2.13</scala.version>

and is used in the version 3 pom.xml without overriding it here:

<dependency>
    <groupId>org.playframework</groupId>
    <artifactId>play_${scala.version}</artifactId>
    <version>${play.version}</version>
    <scope>provided</scope>
</dependency>

The project is then compiled as Scala 3, but since the dependency is listed as provided, it will only crash for the end user when play for scala3 is used

leleuj commented 1 month ago

You are fully right. Good catch! Would min submitting a PR for the project? Thanks

JulienSt commented 1 month ago

I will see what I can do. I hope it is only a version bump and no code change is needed

leleuj commented 1 month ago

I just give a quick try and I see that the SecurityFilterTests.scala must be adjusted...

JulienSt commented 1 month ago

The fix for SecurityFilterTests was easy - just needed to make the type there explicit. I changed the Scala version to the LTS. The newer version threw an error. Making it the LTS should also solve compatibility issues in the near future

leleuj commented 1 month ago

Excellent! Thanks for the PR. I just merged it