[英]Scala, Play2.4, Spark: Task Not Serializable due to SparkConf object
[英]Circular Dependency Error for Google Guice with Play2.4 and scala
我的應用程序使用Play 2.4和Scala 2.11 。我開始轉換現有代碼以使用Play 2.4附帶的Google Guice 。
當我在進行第一組更改后運行代碼時,我發現代碼中的某些DAO失敗並出現循環依賴性錯誤。
例如,我有兩個DAO
class BookDAO @Inject()
(protected val personDAO : PersonDAO,
@NamedDatabase("mysql")protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] {
...
...
val personId = //some id
personDAO.get(personId)
}
class PersonDAO @Inject()
(protected val bookDAO : BookDAO,
@NamedDatabase("mysql")protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] {
...
...
val bookName= //some id
personDAO.getByName(bookName)
}
嘗試訪問BookDAO或PersonDAO時出現以下錯誤
Tried proxying schema.BookDAO to support a circular dependency, but it is not an interface.
at schema.BookDAO.class(Books.scala:52)
while locating schema.BookDAO
有人可以幫我解決這個錯誤。
提前致謝
注入Provider
:
class BookDAO @Inject()(personDaoProvider: Provider[PersonDAO], ...)
extends HasDatabaseConfigProvider[JdbcProfile] {
val personDAO = personDaoProvider.get
def person = personDAO.get(personId)
}
BookDAO
。 這將開箱即用。 Guice已經“知道”如何注入提供商。
將類定義與實現分離。 見Mon Calamari的回答。
按如下方式定義依賴項,並將所有需要的方法從類轉移到trait:
@ImplementedBy(classOf[BookDao])
trait IBookDao {
// abstract defs
}
class BookDao @Inject()(protected val personDAO: IPersonDao, protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] with IBookDao {
}
@ImplementedBy(classOf[PersonDao])
trait IPersonDao {
// abstract defs
}
class PersonDao @Inject()(protected val bookDAO: IBookDao, protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] with IPersonDao {
}
如您所見,每個dao
實現了一個特征,並且所有dao
依賴項都由trait
注入。 這使Guice
可能注入代理類並解決循環依賴問題。
有關詳細信息playframework scala
依賴注入這里 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.