ReactiveMongo自定义BSONDocument {Reader,Writer}

时间:2014-01-31 16:59:49

标签: mongodb scala reactivemongo

我是ReactiveMongo的新手,我想为一个对象创建一个自定义文档阅读器/编写器,但是我收到了这个错误

type mismatch;  found   :
reactivemongo.bson.BSONDocumentReader[reactivemongo.bson.BSONDocument]
required:
reactivemongo.bson.BSONDocumentReader[db.DataBase.Estudiante]  Note:
implicit object EstudianteReader is not applicable here because it
comes after the application point and it lacks an explicit result type
Error occurred in an application involving default arguments.

这是我的代码,基于我在reactivemongo官方网页上找到的example

package db

import scala.concurrent.ExecutionContext.Implicits.global

import reactivemongo.api._
import reactivemongo.bson._

object DataBase {

  //Driver para la conexion
  val driver = new MongoDriver

  //Conexion con mongoDB
  val connection = driver.connection(List("localhost"))

  //Conexion con la base de datos AMDB
  val db = connection("reactive")

  //Colección domainNames que se encuentra en la base de datos AMDB
  val collection = db("estudiantes")

  def findAllDomainNames() = {

    val query = BSONDocument()
    collection.find(query).cursor[Estudiante]
    //.cursor[BSONDocument].collect[List]()
  }

case class Estudiante(id: Option[BSONObjectID], nombre: String, apellidos: String, edad: Int)

  object Estudiante {

    implicit object EstudianteWriter extends BSONDocumentWriter[Estudiante] {
      def write(estudiante: Estudiante): BSONDocument = {
        BSONDocument(
          "_id" -> estudiante.id.getOrElse(BSONObjectID.generate),
          "nombre" -> estudiante.nombre,
          "appellidos" -> estudiante.apellidos,
          "edad" -> estudiante.edad.toString)
      }
    }

    implicit object EstudianteReader extends BSONDocumentReader[Estudiante] {
      def read(doc: BSONDocument): Estudiante = {
        Estudiante(
          doc.getAs[BSONObjectID]("_id"),
          doc.getAs[String]("nombre").get,
          doc.getAs[String]("appellidos").get,
          doc.getAs[Int]("edad").get)
      }
    }

  }

  def main(args: Array[String]) {
    println(findAllDomainNames);
  }
}

缺少什么/错了?

提前谢谢大家!

1 个答案:

答案 0 :(得分:0)

将对象Estudiante的声明移到DataBase上方并在DataBase范围内添加导入:

import Estudiante._