我在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上得到一个空指针。如何使注入不为空,如何确保注入的值永远不为空?
答案 0 :(得分:0)
所以我发现当使用具有依赖注入的特征时,注入参数的签名必须与特征的签名匹配。
例如,在EventController
中,我应该使用var cache: CacheAPI
而不是cache: CacheAPI