[英]How to customize Json serialization using Scala and Play Framework?
[英]Play Framework / Scala: abstract repository and Json de/serialization
這個問題可能與Scala有關,而不僅僅是Play,但問題在於:我正在嘗試為常見的DB操作實現存儲庫的抽象。
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[T]
implicit OWrites[_]
無濟於事。 也許我想要實現的目標是不可能的。 如果沒有,我該如何解決? 非常感謝你。
您應該能夠只使用上下文綁定。
trait Entity {
def id: UUID
}
class Repository[T <: Entity : Writes] {
...
}
這將確保如果作用域中存在隱式的Writes[T]
,它將可用於您的插入和更新功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.