Play 2.5,Scala,编译时DI:使用Java控制器时崩溃,app.requestHandler不是JavaCompatibleHttpRequestHandler

时间:2017-02-03 13:53:07

标签: scala dependency-injection playframework-2.0

我正在使用Play Framework 2.5.12和编译时DI,我想使用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的{​​{1}}(我正在使用MacWire)

Application

但是我必须提供类型override lazy val httpRequestHandler: HttpRequestHandler = wire[JavaCompatibleHttpRequestHandler] HttpFilters的值,我不知道如何获取。

1 个答案:

答案 0 :(得分:0)

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

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