我正在写剧本!2.1 应用使用ReactiveMongo。每个可持久的案例类都有一个包含 2 个隐式对象的对象,实现 BSONReader[...] 和 BSONWriter[...],每个案例类都有返回这些的方法:
trait Persistable {
implicit def getReader: BSONReader[Persistable]
implicit def getWriter: BSONWriter[Persistable]
val collectionName: String
}
case class MyObj () extends Persistable {
override val collectionName: String = MyObj.collectionName
override def getReader: BSONReader[MyObj] = MyObj.MyObjBSONReader
override def getWriter: BSONWriter[MyObj] = MyObj.MyObjBSONWriter
}
object MyObj{
val collectionName: String = "MyObj"
implicit object MyObjBSONReader extends BSONReader[MyObj] {
def fromBSON(document: BSONDocument): MyObj = {
val doc = document.toTraversable
new MyObj(
)
}
}
implicit object MyObjBSONWriter extends BSONWriter[MyObj] {
def toBSON(myObj: MyObj) = {
BSONDocument(
)
}
}
出于某种原因,getReader 似乎工作正常,但 getWriter 错误:
在类型的 trait Persistable 中覆盖方法 getWriter = reactivemongo.bson.handlers.BSONWriter[models.persistable.Persistable]; 方法 getWriter 具有不兼容的类型
我究竟做错了什么?两者似乎都有相似的签名。另一个提示是,如果我从 getWriter 中删除返回类型,我会在 eclipse 中得到编译时间错误:
类型不匹配; 找到:models.persistable.MyObj.MyObjBSONWriter.type 需要:reactivemongo.bson.handlers.BSONWriter[models.persistable.Persistable]
更新:
我按照@AndrzejDoyle 下面所说的做了,但是作为本练习的核心的 Persister 的实现抱怨:
def insert(persistable: Persistable) = {
val collection = db(persistable.collectionName)
import play.api.libs.concurrent.Execution.Implicits._
implicit val reader = persistable.getReader
implicit val writer = persistable.getWriter
collection.insert(persistable)
}
错误:
trait Persistable 接受类型参数