Я использую Play Framework 2.5.12 с компиляцией DI, и я бы хотел использовать Java контроллер (от play-pac4j). Использование контроллера выдает следующее сообщение об ошибке:Play 2.5, Scala, compile-time DI: сбой при использовании Java-контроллера, app.requestHandler не является JavaCompatibleHttpRequestHandler
scala.MatchError: Right((play.core.routing.[email protected]635c42c6,[email protected])) (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 во время выполнения, но с ошибкой с компиляцией не работает, как указано выше.
Я думаю, что я мог бы переопределить httpRequestHandler
, который вводится в Application
в моей сборке компонентов (я использую MacWire)
override lazy val httpRequestHandler: HttpRequestHandler = wire[JavaCompatibleHttpRequestHandler]
Но тогда я должен предоставить значение типов HttpFilters
и JavaHandlerComponents
, которые я «Не знаю, как это сделать.