使用 Deadbolt2 的 Playframework:在类型的特征 DeadboltHandler 中覆盖方法 getSubject

Playframework with Deadbolt2: overriding method getSubject in trait DeadboltHandler of type

我正在使用 Deadbolt2 进行授权。当我 extends DeadboltHandler 并覆盖他们的方法时,我在 eclipse 中收到以下错误:

implements be.objectify.deadbolt.scala.DeadboltHandler.getSubject
overriding method getSubject in trait DeadboltHandler of type [A](request: play.api.mvc.Request[A])Option[be.objectify.deadbolt.core.models.Subject]; method getSubject has incompatible type  

这些是编译时错误并在 getSubject 方法上产生,因为它的 return 类型。我将其 return 类型声明为 Future[Option[Subject]] 并且当我将 Option[Subject] 用作 return 类型时,错误被删除。当我看到 steve https://github.com/schaloner/deadbolt-2-scala-examples/blob/master/app/security/MyDeadboltHandler.scala 的示例时,他使用 Future[Option[Subject]] 并且当我在 eclipse 中导入代码时代码没有错误。当我使用 activator clean compile 命令编译代码时,没有编译时错误。

代码:

override def getSubject[A](request: Request[A]): Future[Option[Subject]] = {
println("Method Start getSubject");
if(!request.headers.get("userId").isEmpty){
   println("If Method Start getSubject");
  val userId = request.headers.get("userId").get;
  userDao.findById(BSONObjectID.apply(userId));
}else{
  println("Else Method Start getSubject");
  Future(Option.empty);
}}

更新

当我使用 deadbolt be.objectify" %% "deadbolt-scala" % "2.3.2 依赖版本时,我在 eclipse 中遇到编译时错误并成功构建 运行。但是当我使用 be.objectify" %% "deadbolt-scala" % "2.3.3 依赖版本时,我也遇到了构建错误。

getSubject 的签名在 2.3.3 中更改,因为与视图层的集成存在缺陷。这些例子也需要更新。

在 v2.4(Java 和 Scala 版本)中,所有接口都将 return Futures 和需要阻塞调用的时候,例如由于模板限制,将有自动包装所需的接口适配器。

请参阅 https://github.com/schaloner/deadbolt-2-scala 的 README 中的 2.3.3 发行说明 - 具体来说,这个

DeadboltHandler#getSubject returns an Option[Subject] in place of an Future[Option[Subject]]. Where the subject is needed, the internal code will take care of wrapping the call in a Future.

抱歉造成混淆。