我想知道Play-Scala中的@Inject注释是如何工作的.它显然注入了依赖,但我很好奇它是如何工作的.当我在类扩展控制器上使用它并将路由生成器设置为injectroutesgenerator时,它似乎从这些类中自动创建对象,但是如何在其他上下文中使用它?
我试过了:
@Inject val mailer: MailerClient = null
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用.@Inject的东西(mailerClient,WS ets.)是否有任何可能直接与值,而不是控制器类?
简而言之:我的应用程序使用Play web framework 2.5.1版.我想使用Deadbolt授权系统和Slick来访问我的数据库中的用户授权信息.我怎样才能做到这一点? Deadbolt是专门为Play而制作的,而且Play带有Slick集成的开箱即用功能,所以它应该是可能的,如果不是很容易的话.
根据Deadbolt文档中的"Integrating Deadbolt",我扩展了这个DeadboltHandler特性.它的抽象getSubject()方法似乎是进行数据库查询的地方(所以说文档但没有任何示例).该方法作为参数接收AuthenticatedRequest并返回Subject基本上经过身份验证的用户标识,以及角色和权限(授权).
我被卡住了,因为虽然Play附带了Slick集成,但文档仅描述了如何在Play控制器中使用它.(注意我想使用依赖注入来执行此操作,因为使用全局查找已弃用且容易出错)
我在我的控制器中成功使用Deadbolt来限制对某些资源的访问,但是对于Deadbolt来说,控制器似乎是错误的地方,正在对授权细节进行数据库查询(如果是,那么这DeadboltHandler将是无用的).控制器构造函数签名定义类似于(注意控制器访问存储Web内容的默认数据库而不是授权数据库):
class Application @Inject()(
dbConfigProvider: DatabaseConfigProvider,
playConfig: play.api.Configuration,
deadbolt: DeadboltActions
) extends Controller {
Run Code Online (Sandbox Code Playgroud)
这样可行.但是,类似地注释DeadboltHandler扩展名@Inject无法提供对数据库的Slick访问:
class AuthHandler @Inject()(@play.db.NamedDatabase("auth") dbConfigProvider: DatabaseConfigProvider)
extends DeadboltHandler {
Run Code Online (Sandbox Code Playgroud)
结果是
not enough arguments for constructor AuthHandler: …Run Code Online (Sandbox Code Playgroud)