2014-06-09 51 views
2

我有一個非常簡單的案例類是一個更大的案例類的一部分。隱式價值沒有找到BSON Writer in reactivemongo

case class PublisherStatus(status: String) 
case class Publisher(id: Option[BSONObjectID], name: String, status: PublisherStatus, keywords: List[String], updatedAt: Option[DateTime], outputChannelIP: String, outputChannelName: String) 

我已經爲它定義了BSON Reader和Writer,如下所示。

implicit object StatusBSONReader extends BSONDocumentReader[PublisherStatus] { 
    def read(doc: BSONDocument): PublisherStatus = 
     PublisherStatus(
     doc.getAs[String]("status").get 
    ) 
    } 

    implicit object StatusBSONWriter extends BSONDocumentWriter[PublisherStatus] { 
    def write(status: PublisherStatus): BSONDocument = 
     BSONDocument(
     "status" -> status.status) 
    } 

但是,當我嘗試執行以下操作時出現編譯錯誤。

def updateState(id: String, s: String) { 
    import models.PublisherBSONWriter._ 
    implicit val statusWrites = Json.writes[PublisherStatus] 
    val objectId = new BSONObjectID(id) 
    val status = PublisherStatus(s) 
    val modifier = BSONDocument("$set" -> status) 

    val updateFuture = collection.update(BSONDocument("_id" -> objectId), modifier) 

    } 

錯誤 -

could not find implicit value for parameter writer: reactivemongo.bson.BSONWriter[models.PublisherStatus, _ <: reactivemongo.bson.BSONValue] 
[error]  val modifier = BSONDocument("$set" -> status) 
[error]          ^
[error] one error found 
[error] (compile:compile) Compilation failed 

回答

5

讀者和作家的PublisherStatus不應該是一個BSONDocumentReaderBSONDocumentWriter,而是BSONReaderBSONWriter

或者爲了使事情更容易,請使用BSONHandler。東西沿線

implicit val bson = new BSONHandler[BSONString, PublisherStatus] { 
    def read(bson: BSONString) = PublisherStatus(bson.value) 
    def write(status: PublisherStatus) = BSONString(status.status) 
}