0

と依存性の注入は2.5Scalaは2.5.Xを再生する - 私はScalaで依存性注入を使用していた形質

を再生する私は、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にヌルポインターを取得します。インジェクションをnullにしないようにするにはどうすればいいですか?インジェクションされた値が決してnullにならないようにするにはどうすればよいですか?

+0

形質キャッシュ 'def'コントローラにおけるキャッシュ(josephpconleyが指摘したように)' val'を作るを使用しているべきである。例えば

、。 – rethab

答えて

0

私は、Dependency Injectionで形質を使用する場合、注入されたパラメータのシグネチャがその形質のシグネチャと一致しなければならないことを発見しました。 EventControllerで、Iは、var cache: CacheAPI代わりに単にcache: CacheAPI

+0

そのパラメータを作成するときは、実際には可変の 'var'の代わりに不変の' val'を使うべきです。私はあなたがそのキャッシュのインスタンスを変異させたいとは思わない。 – josephpconley

関連する問題