[英]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.