【问题标题】:Play Framework / Scala: abstract repository and Json de/serializationPlay Framework / Scala:抽象存储库和 Json 反序列化
【发布时间】:2015-10-12 13:07:36
【问题描述】:

这个问题可能更多是关于 Scala 而不是 Play,但这里是:我正在尝试实现对常见数据库操作的存储库的抽象。

trait Entity {
  def id: UUID
}

trait Repository[T <: Entity] {

  val JSON_KEY_ID = "_id"

  def collection: JSONCollection

  def insert(t: T): Future[Either[String, T]] = {
    collection.insert(t).map(wr => if (wr.ok) Right(t) else Left(wr.getMessage()))
      .recover { case t => Left(t.getMessage) }
  }

   def update(t: T): Future[Either[String, T]] = {
    val selector = Json.obj(JSON_KEY_ID -> t.id.toString)
    collection.update(selector, t).map(wr => if (wr.ok) Right(t) else Left(wr.getMessage()))
      .recover { case t => Left(t.getMessage) }
  }
}

然后我有我想用它的对象:

case class UserDAO(id: UUID) extends Entity[UserDAO]

object UserDAO {
  val JSON_KEY_ID = "_id"

  implicit val userDaoWrites: OWrites[UserDAO] = new OWrites[UserDAO] {
    def writes(user: UserDAO): JsObject = Json.obj(
      JSON_KEY_ID -> JsString(user.id.toString)
    )
  }

  implicit val userDaoReads: Reads[UserDAO] = (
    (__ \ JSON_KEY_ID).read[UUID]
    )(UserDAO.apply _)
}

然后我像这样定义它的存储库:

class UserRepository @Inject()(val reactiveMongoApi: ReactiveMongoApi) extends Repository[UserDAO] {
  val db = reactiveMongoApi.db
  override def collection: JSONCollection = db.collection[JSONCollection]("users")
}

我得到的错误是

No Json serializer as JsObject found for type T. Try to implement an implicit OWrites or OFormat for this type.
collection.insert(t).map(wr => if (wr.ok) Right(t) else Left(wr.getMessage()))
                 ^

我尝试提供implicit OWrites[T],甚至implicit OWrites[_] 均无济于事。也许我想要达到的目标是不可能的。如果没有,我该如何解决这个问题?非常感谢。

【问题讨论】:

  • Entity 定义在哪里?
  • 感谢@Ryan 的评论。添加它。

标签: json scala playframework implicit traits


【解决方案1】:

您应该能够只使用上下文绑定。

trait Entity {
  def id: UUID
}

class Repository[T <: Entity : Writes] {
  ...
}

这将确保如果在范围内存在隐式 Writes[T],它将可用于您的插入和更新函数。

【讨论】:

  • 谢谢,这正是我所需要的,而且我不得不将Repository 设为一个类,因为特征不能具有带有上下文边界的类型参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 2012-11-18
  • 2012-09-17
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
相关资源
最近更新 更多