Сопоставление ReactiveMongo из ObjectId в класс случая BSONObjectID

я новичок в Scala и Play, я пытаюсь сопоставить Scala BSONObjectID с mongo ObjectId. Я получил много образцов из Интернета, но все еще застрял в одной ошибке времени компиляции. Ниже приведен код моего класса Case:

case class UserDetail(
 val _id: Option[BSONObjectID],
 val name: String,
 val age: Double,
 var created: Option[Long]
)  

object UserDetail{
 implicit val userDetailReads: Reads[UserDetail] = (
 (JsPath \ "_id").readNullable[BSONObjectID] and
 (JsPath \ "name").read[String] and
 (JsPath \ "age").read[Double] and
 (JsPath \ "created").readNullable[Long]
)(UserDetail.apply _)

implicit val userDetailWrites: Writes[UserDetail] = (
(JsPath \ "_id").writeNullable[BSONObjectID]and
(JsPath \ "name").write[String] and
(JsPath \ "age").write[Double] and
(JsPath \ "created").writeNullable[Long]
)(unlift { UserDetail.unapply })}

Это (JsPath \ "_id").readNullable[BSONObjectID] генерирует ошибку времени компиляции, как показано ниже:

not enough arguments for method readNullable: (implicit r: play.api.libs.json.Reads[reactivemongo.bson.BSONObjectID])play.api.libs.json.Reads[Option[reactivemongo.bson.BSONObjectID]]. Unspecified value parameter r.
not enough arguments for method readNullable: (implicit r: play.api.libs.json.Reads[reactivemongo.bson.BSONObjectID])play.api.libs.json.Reads[Option[reactivemongo.bson.BSONObjectID]]. Unspecified value parameter r.

Это (JsPath \ "_id").writeNullable[BSONObjectID] также вызывает ту же ошибку.

Я хочу отформатировать свой запрос json. Поэтому я использую пользовательский форматтер, как показано ниже:

object BSONObjectIDFormat extends Format[BSONObjectID]{

 def writes(objectId: BSONObjectID): JsValue = JsString(objectId.toString())

 def reads(json: JsValue): JsResult[BSONObjectID] = json match {
  case JsString(x) => {
  val maybeOID: Try[BSONObjectID] = BSONObjectID.parse(x)
  if(maybeOID.isSuccess) JsSuccess(maybeOID.get) else {
    JsError("Expected BSONObjectID as JsString")
  }
}
case _ => JsError("Expected BSONObjectID as JsString")
}}

Мой запрос Json, как показано ниже:

{
"_id":{"$oid":"54fd4b7084071e6a6ab13cee"},
"name" : "Akka",
"age" : 30,
"created" : 1425886070013
}

Когда я отправляю запрос JSON, я получаю следующую ошибку:

[error] D:\play_projects\scala_play_sample\app\models\UserDetail.scala:35: No Js
on deserializer found for type reactivemongo.bson.BSONObjectID. Try to implement
an implicit Reads or Format for this type.
[error]     (JsPath \ "_id").readNullable[BSONObjectID] and
[error]                                  ^
[error] D:\play_projects\scala_play_sample\app\models\UserDetail.scala:42: No Js
on serializer found for type reactivemongo.bson.BSONObjectID. Try to implement a
n implicit Writes or Format for this type.
[error]     (JsPath \ "_id").writeNullable[BSONObjectID]and

person Harmeet Singh Taara    schedule 09.03.2015    source источник


Ответы (1)


В этом случае мы просто инициализируем наш пользовательский модуль форматирования в классе Case. Я не уверен, почему игра автоматически не рисует фоматтер. Теперь код, как показано ниже:

case class UserDetail(
 val _id: Option[BSONObjectID],
 val name: String,
 val age: Double,
 var created: Option[Long]
)  

object UserDetail{

 implicit val idFormatter = BSONObjectIDFormat

 implicit val userDetailReads: Reads[UserDetail] = (
 (JsPath \ "_id").readNullable[BSONObjectID] and
 (JsPath \ "name").read[String] and
 (JsPath \ "age").read[Double] and
 (JsPath \ "created").readNullable[Long]
)(UserDetail.apply _)

 implicit val userDetailWrites: Writes[UserDetail] = (
 (JsPath \ "_id").writeNullable[BSONObjectID]and
 (JsPath \ "name").write[String] and
 (JsPath \ "age").write[Double] and
 (JsPath \ "created").writeNullable[Long]
 )(unlift { UserDetail.unapply })}
person Harmeet Singh Taara    schedule 09.03.2015
comment
Обычно не рекомендуется иметь конкретный тип BSON в классе case модели. Он связывает определение модели приложения с подробной реализацией базовой библиотеки постоянства. - person cchantep; 17.03.2015
comment
Привет @cchantep вместо конкретного типа BSON. что нам нужно использовать? Потому что, когда я использую тип String, я не могу выполнять такие запросы, как поиск по идентификатору и т. д. - person Harmeet Singh Taara; 17.03.2015