0

我使用依賴注入Scala中播放2.5斯卡拉玩2.5.X - 依賴注入與性狀

我讀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中的緩存庫。

每當我試圖在這個控制器上調用一個動作時,我在cache.get上得到一個空指針。我如何讓注入不爲空,以及如何確保注入的值永遠不會爲空?

+0

請在性狀緩存'def',然後緩存在控制器中的'val'(如josephpconley指出)。 – rethab

回答

0

所以我發現,當使用具有依賴注入的特徵時,注入參數的簽名必須與特徵匹配。

例如,在EventController,我應該用var cache: CacheAPI而不是簡單地cache: CacheAPI

+0

創建該參數時,您應該真的使用不可變的'val'而不是可變的'var'。我認爲你不希望緩存的這個實例發生變異。 – josephpconley