2017-02-03 5 views
0

Я использую 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, которые я «Не знаю, как это сделать.

ответ

0

После разговора с некоторыми экспертами в режиме онлайн, кажется, что использование Java-контроллера в приложении для игры Scala - довольно экзотическая вещь. Хотя, безусловно, возможно создать JavaCompatibleHttpRequestHandler, для этого требуется создание довольно много функций воспроизведения Java (в приложении для воспроизведения Scala).

Тот факт, что пример Scala в их README.md использует неудачный Java-контроллер. Вместо этого можно было бы позвонить pac4j напрямую, не используя play-pac4j.