如何DI路由器访问文档()



Play路由器有一个documentation方法,我想在控制器中访问它以提供(你猜对了!(文档。

我曾经通过play.api.Play.routes.documentation访问它,但当然play.api.Play现在已经弃用了。

所以我尝试将路由器注入我的控制器:

@Singleton
class IndexCtrl @Inject()(implicit
                          components: ControllerComponents,
                          sil: Silhouette[OatEnv],
                          router: Router,
                          val ex: ExecutionContext
                         )

但这会导致 Guice 中的循环依赖:

[info] oat.wsvc.controllers.IndexCtrlSpec *** ABORTED ***
[info]   com.google.inject.ProvisionException: Unable to provision, see the following errors:
[info] 
[info] 1) Found a circular dependency involving play.api.routing.Router, and circular dependencies are disabled.
[info]   while locating play.api.inject.RoutesProvider
[info]   while locating play.api.routing.Router
[info]   at oat.wsvc.controllers.IndexCtrl.<init>(IndexCtrl.scala:29)
[info]   at oat.wsvc.controllers.IndexCtrl.class(IndexCtrl.scala:25)
[info]   while locating oat.wsvc.controllers.IndexCtrl
[info]     for the 18th parameter of wsvc.Routes.<init>(Routes.scala:108)
[info]   while locating wsvc.Routes
[info]   while locating play.api.inject.RoutesProvider
[info]   while locating play.api.routing.Router
[info]     for the 1st parameter of play.api.http.JavaCompatibleHttpRequestHandler.<init>(HttpRequestHandler.scala:222)

我尝试注入错误消息中提到的RoutesProvider;相同的结果。 我尝试将路由器作为类中的一个字段注入;相同的结果。 我已经注意到并尝试了 DI 文档中有关管理循环依赖项的部分;相同的结果。

如何使用 DI 访问路由器?

PS:请注意,这与访问控制器的路由不同。 我需要的方法在路由器本身中。

我面临的问题是尝试将路由器注入控制器时出现 Guice 错误。 但是,我可以将 Router 对象注入到另一个没有路由器引用的方法的类中。

就我而言,我可以重新排列我的代码,以便在应用程序启动时使用路由器的文档。 所以我把它注入到一个急切的单例而不是控制器中。