2016-01-13 56 views
0

A similar question已被問到,但我沒有覺得它非常有幫助。我正在將MyRepository注入MyActor。在啓動時,我得到以下異常:PlayFramework 2.4,演員注射問題:沒有啓動應用程序

[error] - akka.actor.OneForOneStrategy - Unable to provision, see the following errors: 

1) Error injecting constructor, java.lang.RuntimeException: There is no started application 
    at infrastructure.repository.MyRepository.<init>(MyRepository.scala:13) 
    at infrastructure.repository.MyRepository.class(MyRepository.scala:13) 
    while locating infrastructure.repository.MyRepository 
    for parameter 0 at service.command.MyActor.<init>(MyActor.scala:38) 
    at service.command.MyActor.class(MyActor.scala:38) 
    while locating service.command.MyActor 

1 error 
akka.actor.ActorInitializationException: exception during creation 
     at akka.actor.ActorInitializationException$.apply(Actor.scala:172) ~[akka-actor_2.11-2.4.0.jar:na] 
     at akka.actor.ActorCell.create(ActorCell.scala:605) ~[akka-actor_2.11-2.4.0.jar:na] 
     at akka.actor.ActorCell.invokeAll$1(ActorCell.scala:460) ~[akka-actor_2.11-2.4.0.jar:na] 
     at akka.actor.ActorCell.systemInvoke(ActorCell.scala:482) ~[akka-actor_2.11-2.4.0.jar:na] 
     at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala:282) [akka-actor_2.11-2.4.0.jar:na] 
     at akka.dispatch.Mailbox.run(Mailbox.scala:223) [akka-actor_2.11-2.4.0.jar:na] 
     at akka.dispatch.Mailbox.exec(Mailbox.scala:234) [akka-actor_2.11-2.4.0.jar:na] 
     at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) [scala-library-2.11.7.jar:na] 
     at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) [scala-library-2.11.7.jar:na] 
     at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) [scala-library-2.11.7.jar:na] 
     at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) [scala-library-2.11.7.jar:na] 
Caused by: com.google.inject.ProvisionException: Unable to provision, see the following errors: 
.... [same thing] 

我已經按照指示進行,我有一個像

class InjectionModule extends AbstractModule with AkkaGuiceSupport { 
    def configure = { 
    bindActor[MyActor]("my-actor") 
    } 
} 

這一個模塊是MyRepository代碼:

@Singleton 
class MyRepository @Inject()(val reactiveMongoApi: ReactiveMongoApi) extends Repository { 

    // init db connection 
    override val collection = getCollection(reactiveMongoApi, "card") 

    def getById(id: CardId) = get(Json.obj(Entity.JSON_KEY_ID -> id.toString)) 

    // .. other similar methods 
} 


abstract class Repository { 
    val collection: JSONCollection 

    val dbName = current.configuration.getString("mongodb.database.name").getOrElse("") 

    protected def getCollection(reactiveMongoApi: ReactiveMongoApi, name: String) = 
    reactiveMongoApi.connection.db(dbName, FailoverStrategy(initialDelay = 1.second, retries = 20)).collection[JSONCollection](name) 

    protected def get(query: JsObject): Future[Either[String, Option[A]]] = { 
    collection.find(query).one[A].map { 
     case Some(a) => Right(Some(a)) 
     case None => Right(None) 
    }.recover { case t => Left(t.getMessage) } 
    } 

    // ... similar methods 
} 

這是MyActor的'開放線':

@Singleton 
class MyActor @Inject()(cardViewRepository: CardViewRepository) extends Actor { 
    //.. actor methods 
} 

有趣的是,它曾經工作,突然它拋出這個異常。也許是因爲我從2.4.3升級到2.4.6?

+3

你可以顯示你的'MyRepository'代碼嗎?問題似乎在構造函數中。也許你正在使用一些需要注入的Play組件(例如:'Configuration','Play.application()'等)? – Salem

+0

@Salem感謝您的評論。已添加代碼。 – ticofab

+1

很難確定什麼時候進口和生產線號碼不可用。它可能是這條線,你訪問當前的應用程序? 'val dbName = current.configuration.getString(「mongodb.database.name」)。getOrElse(「」)' – rvange

回答

1

@Salem在評論中是正確的:「可能問題出在上面提到的問題,嘗試在你的MyRepository類中注入配置,並使用in而不是current.configuration。如果你確實需要應用程序對象,我認爲你可以注入它,而不是...「 我需要在MyRepository中注入配置。