1

私は 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
4

2 に答える 2

0

この場合、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 })}
于 2015-03-09T11:41:20.227 に答える