【发布时间】: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-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,它被注入到我的组件程序集中的Application(我正在使用MacWire)
override lazy val httpRequestHandler: HttpRequestHandler = wire[JavaCompatibleHttpRequestHandler]
但是我必须提供HttpFilters 和JavaHandlerComponents 类型的值,我不知道如何获得。
【问题讨论】:
标签: scala dependency-injection playframework-2.0