Scala Play 2.5.X - 具有特征的依赖注入

时间:2016-10-19 16:05:28

标签: scala playframework dependency-injection playframework-2.5

我在Scala Play 2.5中使用依赖注入

我阅读了DI指南并设置我的控制器以注入缓存:

class EventController @Inject()(db: Database, cache: CacheApi) 
  extends Controller with Authentication {

...
}

身份验证是我为了指定哪些端点绝对需要用户而做出的特性。这是定义:

class UserRequest[A](
  val uid: Option[Long], request: Request[A]
) extends WrappedRequest[A](request)

trait Authentication { self: Controller =>
  var cache: CacheApi = null

  ...

  def translateToken(token: String): Option[Long] = {
    val uidstr = cache.get[Long](token)
    if( uidstr.isDefined ){
      return Some(uidstr.get)
    } else {
      return None
    }
  }

  object AuthenticatedAction extends ActionBuilder[UserRequest] {
    def invokeBlock[A]( request: Request[A], block: (UserRequest[A]) => Future[Result]) = {
      var uid: Option[Long] = None;
      val token = request.session.get("token");
      if( token.isDefined ){
        // verify session is genuine
        uid = translateToken(token.get)
        if( !uid.isDefined ){
          // token is invalid or outdated. reset the session
          request.session - "token"
        }
      }
      block( new UserRequest[A](uid, request)  )
    }
  }

  ...
} 

我的build.sbt中有缓存lib。

每当我尝试在这个控制器上调用一个动作时,我在cache.get上得到一个空指针。如何使注入不为空,如何确保注入的值永远不为空?

1 个答案:

答案 0 :(得分:0)

所以我发现当使用具有依赖注入的特征时,注入参数的签名必须与特征的签名匹配。

例如,在EventController中,我应该使用var cache: CacheAPI而不是cache: CacheAPI