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 对象注入到另一个没有路由器引用的方法的类中。
就我而言,我可以重新排列我的代码,以便在应用程序启动时使用路由器的文档。 所以我把它注入到一个急切的单例而不是控制器中。