sealed trait BiosRecord {
val key : String
val patientId : String
val startime : Long // in microseconds
val endtime : Long // in microseconds
val byteEncoding : Int // 1, 2, 3 or 4
}
case class CBiosRecord
(
key : String,
patientId : String,
startime : Long, // in microseconds
endtime : Long, // in microseconds
byteEncoding : Int, // 1, 2, 3 or 4
) extends BiosRecord
case class NBiosRecord
(
key : String,
patientId : String,
startime : Long, // in microseconds
endtime : Long, // in microseconds
byteEncoding : Int, // 1, 2, 3 or 4
channels : List[NNBiosChannel],
events : Option[List[NNBiosEvent]],
preRecordComment : String,
postRecordComment : String,
) extends BiosRecord
******* BiosRecord reads/writes ******/
implicit val biosRecordReads = {
val ccwBiosRecord = Json.reads[CCWBiosRecord]
val nnBiosRecord = Json.reads[NNBiosRecord]
__.read[CCWBiosRecord](ccwBiosRecord).map(x => x : BiosRecord) |
__.read[NNBiosRecord](nnBiosRecord).map(x => x : BiosRecord)
}
implicit val biosRecordWrites = Writes[BiosRecord] {
case ccwBiosRecord : CCWBiosRecord =>
Json.writes[CCWBiosRecord].writes(ccwBiosRecord)
case nnBiosRecord : NNBiosRecord =>
Json.writes[NNBiosRecord].writes(nnBiosRecord)
}
So this code compile and I can also serialize a CRecord to JSON (also the case for a NRecord). Now, I put the lines code giving to me an error :
// ReactiveMongo
import play.modules.reactivemongo.ReactiveMongoApi
import play.modules.reactivemongo.json._, ImplicitBSONHandlers._
import reactivemongo.play.json.collection.{JSONCollection, JsCursor}
// Scala
import scala.concurrent.ExecutionContext.Implicits.global
object MongoDBService {
val config = Play.application().configuration()
val mongoCollectionName = config.getString("mongodb.collection.name")
def reactiveMongoApi = current.injector.instanceOf[ReactiveMongoApi]
val mongoCollection = reactiveMongoApi.db.collection[JSONCollection](mongoCollectionName)
def updateBiosChannel
(
recordKey : String
) : Unit = {
val futureRecord = mongoCollection.find(Json.obj("key"->recordKey)).one[BiosRecord]
futureRecord map { recordOpt =>
recordOpt match {
case None => ()
case Some(record : BiosRecord) =>
record match {
case cRecord : CBiosRecord =>
mongoCollection.update(Json.obj("key"->recordKey), ccwRecord)
case nRecord : NBiosRecord =>
mongoCollection.update(Json.obj("key"->recordKey), nnRecord)
}
}
}
}
}
app/services/MongoDBService.scala:33: No Json serializer as JsObject found for type play.api.libs.json.JsObject. Try to implement an implicit OWrites or OFormat for this type.
[error] val futureRecord = mongoCollection.find(Json.obj("key"->recordKey)).one[BiosRecord]
P.S. Please check the formatting of your code. For now it's quite hard to read there.
First fix the missing serializer for JsObject: http://reactivemongo.org/releases/0.11/documentation/json/overview.html
import play.api.libs.json.JsObject
import play.modules.reactivemongo.ReactiveMongoApi
import play.api.libs.json._
import play.modules.reactivemongo.json._, ImplicitBSONHandlers._
import reactivemongo.play.json._ // from the reactivemongo doc
import reactivemongo.play.json.collection.JSONCollection
No Json serializer as JsObject found for type play.api.libs.json.JsObject. Try to implement an implicit OWrites or OFormat for this type.
[error] val futureRecord = mongoCollection.find(Json.obj("key"->recordKey)).one[BiosRecord]
// import play.modules.reactivemongo.json._
// import play.modules.reactivemongo.json.collection._