私は Scala と Play の初心者ですBSONObjectID
。Scala を mongoにマップしようとしていますObjectId
。インターネットから多くのサンプルを取得しましたが、コンパイル時エラーが 1 度発生します。以下は私のケースクラスのコードです:
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