0

My Mongo DB abstract Dao is defined as follows

    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")
  }
}

I'm getting an error in the following line of code when converting a case class to JSON.

Error:(31, 26) value toJson is not a member of type parameter T

val json: String = r.toJson.compactPrint

val json: String = r.toJson.compactPrint

The trait JsonDbImplicits is as follows

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)

}

The case classes UserEmail and UserProfile are defined as follows

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]

and

case class UserProfile
(
  // id is the same as AccountId
  @Key("_id") id: String = UUID.randomUUID().toString
  , gender: Option[String] = None
  , first_name: Option[String] = Some("")
  , last_name: Option[String] = Some("")
  , yob: Option[Int] = None
  , kids: Option[Int] = None
  , income: Option[Int] = None
  , postcode: Option[String] = None
  , location: Option[Boolean] = Some(true)
  , opt_in: Option[Boolean] = Some(true)
  , third_party: Option[Boolean] = Some(true)
  , ts_created: DateTime = now
  , ts_updated: DateTime = now

) extends Keyable[String]

trait DbUserProfile extends DbMongoDAO1[String,UserProfile]

What am I missing?

  • you might just need override def insertNew[T : JsonFormat](r:T): Result[String,T] ... As it stands the method is generic, T could be any type, but you you need to restrict it to things with a toJson method – corn_dog Jan 20 '17 at 16:52
  • Looks like T is already defined at the class level so you'll need to fit the restriction in there somewhere. – corn_dog Jan 20 '17 at 16:57

0 Answers0