scalareactivemongo

Could not find implicit value for parameter write eror, yet I defined the handler using the macro


I have the following:

Account.scala

package modules.accounts

import java.time.Instant
import reactivemongo.api.bson._

case class Account(id: String, name: String)

object Account {
  type ID = String

  implicit val accountHandler: BSONDocumentHandler[Account] = Macros.handler[Account]

//   implicit def accountWriter: BSONDocumentWriter[Account] = Macros.writer[Account]
//   implicit def accountReader: BSONDocumentReader[Account] = Macros.reader[Account]
}

AccountRepo.scala

package modules.accounts

import java.time.Instant
import reactivemongo.api.collections.bson.BSONCollection

import scala.concurrent.ExecutionContext

final class AccountRepo(
    val coll: BSONCollection
)(implicit ec: ExecutionContext) {
  import Account.{ accountHandler, ID }

  def insertTest() = {
    val doc = Account(s"account123", "accountName") //, Instant.now)
    coll.insert.one(doc)
  }
}

The error I am getting is:

could not find implicit value for parameter writer: AccountRepo.this.coll.pack.Writer[modules.accounts.Account]
[error]     coll.insert.one(doc)

From what I understand the implicit handler that is generated by the macro should be enough and create the Writer. What am I doing wrong?

Reference: http://reactivemongo.org/releases/1.0/documentation/bson/typeclasses.html


Solution

  • The code is mismixing different versions.

    The macro generated handler is using the new BSON API, as it can be seen with the import reactivemongo.api.bson, whereas the collection is using an old driver, as it can be seen as it uses reactivemongo.api.collections.bson instead of reactivemongo.api.bson.collection.

    It's recommended to have a look at the documentation, and not mixing incompatible versions of related libraries.