【问题标题】:Play 2.5, Scala, compile-time DI: crash when using Java controller, app.requestHandler is not a JavaCompatibleHttpRequestHandlerPlay 2.5, Scala, compile-time DI: crash when using Java controller, app.requestHandler is not a JavaCompatibleHttpRequestHandler
【发布时间】:2017-02-16 17:04:15
【问题描述】:

我正在使用带有编译时 DI 的 Play Framework 2.5.12,并且我想使用 Java 控制器(来自 play-pac4j)。使用控制器失败并出现以下错误:

scala.MatchError: Right((play.core.routing.HandlerInvokerFactory$JavaActionInvokerFactory$$anon$14$$anon$3@635c42c6,play.api.DefaultApplication@53dff0a2)) (of class scala.util.Right)
at play.core.server.netty.PlayRequestHandler.handle(PlayRequestHandler.scala:93)
at play.core.server.netty.PlayRequestHandler.channelRead(PlayRequestHandler.scala:163)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366)

挖了一会,发现JavaCompatibleHttpRequestHandler,应该是application.requestHandler默认使用的,在#5357中注明/在#5631中实现。似乎只有在使用运行时 DI 时才会出现这种情况,而在使用编译时 DI 时则不然:在这种情况下,它只是一个 DefaultHttpRequestHandler

为了在一个小示例中重现这一点,我采用了 play-scalaplay-scala-compile-di-with-tests 示例项目,并为每个项目添加了一个简单的 Java 控制器。差异是here for play-scalahere for play-scala-compile-di-with-tests。使用sbt run,然后使用curl localhost:9000/hi 可以与运行时DI 一起使用,但在编译时DI 中失败,与上述相同的错误。

我想我可以覆盖httpRequestHandler,它被注入到我的组件程序集中的Application(我正在使用MacWire)

override lazy val httpRequestHandler: HttpRequestHandler = wire[JavaCompatibleHttpRequestHandler]

但是我必须提供HttpFiltersJavaHandlerComponents 类型的值,我不知道如何获得。

【问题讨论】:

    标签: scala dependency-injection playframework-2.0


    【解决方案1】:

    在与一些游戏专家离线交谈后,似乎在 Scala 游戏应用程序中使用 Java 控制器是一件相当奇特的事情。虽然当然可以创建 JavaCompatibleHttpRequestHandler,但它需要实例化大量 Java 播放功能(在 Scala 播放应用程序中)。

    不幸的是,他们的 README.md 中的play-pac4j Scala 示例确实使用了 Java 控制器。相反,可以直接调用pac4j,而不使用play-pac4j

    【讨论】:

      猜你喜欢
      • 2021-04-22
      • 2013-10-20
      • 1970-01-01
      • 2016-04-02
      • 2016-09-14
      • 2018-11-02
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多