我正在使用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-scala
和play-scala-compile-di-with-tests
示例项目,并为每个项目添加了一个简单的Java控制器。差异为here for play-scala
和here 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
的值,我不知道如何获取。
答案 0 :(得分:0)
在与一些游戏专家离线交谈后,似乎在Scala播放应用程序中使用Java控制器是一件相当奇特的事情。虽然创建JavaCompatibleHttpRequestHandler
当然是可能的,但它需要实例化大量的Java播放功能(在Scala播放应用程序中)。
事实上,他们的README.md中的play-pac4j Scala示例使用Java控制器是不幸的。相反,可以直接拨打pac4j
而不使用play-pac4j
。