Mongo DB DAO和Spray JSON:

Mongo DB DAO和Spray JSON:,json,mongodb,scala,spray-json,Json,Mongodb,Scala,Spray Json,我的Mongo DB抽象Dao定义如下 abstract class DbMongoDAO1[K, T <: Keyable[K]] (implicit val manifestT: Manifest[T], val manifestK: Manifest[K]) extends DbDAO[K, T] with DbDAOExtensions[K, T] with MongoConnection2 with JsonDbImplicits { v

我的Mongo DB抽象Dao定义如下

    abstract class DbMongoDAO1[K, T <: Keyable[K]] (implicit val manifestT: Manifest[T], val manifestK: Manifest[K])
  extends DbDAO[K, T]
    with DbDAOExtensions[K, T]
    with MongoConnection2
    with JsonDbImplicits
{

  val thisClass = manifestT.runtimeClass
  val simpleName = thisClass.getSimpleName

  lazy val collection = db.getCollection(s"${DbMongoDAO1.tablePrefix}$simpleName")

  override def insertNew(r:T): Result[String,T] = {
    val json: String = r.toJson.compactPrint

    collection.insertOne(Document(json))

    KO("Not Implemented")
  }
}
trait JsonDbImplicits extends DefaultJsonProtocol
  with SprayJsonSupport with JodaImplicits {

  implicit val json_UserEmail:RootJsonFormat[UserEmail] = jsonFormat5(UserEmail)

  implicit val json_UserProfile:RootJsonFormat[UserProfile] = jsonFormat13(UserProfile)

  implicit val json_UserSession:RootJsonFormat[UserSession] = jsonFormat5(UserSession)

}
case class UserEmail
(
  // it is the full email address
  @Key("_id") id: String
  , account_id: String
  , active: Boolean = false
  , ts_created: DateTime = now
  , ts_updated: DateTime = now
) extends Keyable[String]

trait DbUserEmail extends DbMongoDAO1[String,UserEmail]
JsonDbImplicits的特点如下

    abstract class DbMongoDAO1[K, T <: Keyable[K]] (implicit val manifestT: Manifest[T], val manifestK: Manifest[K])
  extends DbDAO[K, T]
    with DbDAOExtensions[K, T]
    with MongoConnection2
    with JsonDbImplicits
{

  val thisClass = manifestT.runtimeClass
  val simpleName = thisClass.getSimpleName

  lazy val collection = db.getCollection(s"${DbMongoDAO1.tablePrefix}$simpleName")

  override def insertNew(r:T): Result[String,T] = {
    val json: String = r.toJson.compactPrint

    collection.insertOne(Document(json))

    KO("Not Implemented")
  }
}
trait JsonDbImplicits extends DefaultJsonProtocol
  with SprayJsonSupport with JodaImplicits {

  implicit val json_UserEmail:RootJsonFormat[UserEmail] = jsonFormat5(UserEmail)

  implicit val json_UserProfile:RootJsonFormat[UserProfile] = jsonFormat13(UserProfile)

  implicit val json_UserSession:RootJsonFormat[UserSession] = jsonFormat5(UserSession)

}
case class UserEmail
(
  // it is the full email address
  @Key("_id") id: String
  , account_id: String
  , active: Boolean = false
  , ts_created: DateTime = now
  , ts_updated: DateTime = now
) extends Keyable[String]

trait DbUserEmail extends DbMongoDAO1[String,UserEmail]
案例类UserEmail和UserProfile的定义如下

    abstract class DbMongoDAO1[K, T <: Keyable[K]] (implicit val manifestT: Manifest[T], val manifestK: Manifest[K])
  extends DbDAO[K, T]
    with DbDAOExtensions[K, T]
    with MongoConnection2
    with JsonDbImplicits
{

  val thisClass = manifestT.runtimeClass
  val simpleName = thisClass.getSimpleName

  lazy val collection = db.getCollection(s"${DbMongoDAO1.tablePrefix}$simpleName")

  override def insertNew(r:T): Result[String,T] = {
    val json: String = r.toJson.compactPrint

    collection.insertOne(Document(json))

    KO("Not Implemented")
  }
}
trait JsonDbImplicits extends DefaultJsonProtocol
  with SprayJsonSupport with JodaImplicits {

  implicit val json_UserEmail:RootJsonFormat[UserEmail] = jsonFormat5(UserEmail)

  implicit val json_UserProfile:RootJsonFormat[UserProfile] = jsonFormat13(UserProfile)

  implicit val json_UserSession:RootJsonFormat[UserSession] = jsonFormat5(UserSession)

}
case class UserEmail
(
  // it is the full email address
  @Key("_id") id: String
  , account_id: String
  , active: Boolean = false
  , ts_created: DateTime = now
  , ts_updated: DateTime = now
) extends Keyable[String]

trait DbUserEmail extends DbMongoDAO1[String,UserEmail]


我缺少什么?

您可能只需要覆盖def insertNew[T:JsonFormat](r:T):结果[String,T]。。。就目前而言,该方法是泛型的,T可以是任何类型,但您需要将其限制为使用toJson方法的对象。看起来T已经在类级别定义了,因此您需要在其中的某个位置满足该限制。