0

私はReactivemongoデータベース(2.6)を初めて使用します。jsonオブジェクト(キーと値のペアであり、UIから[送信]ボタンをクリックした後、データベースに保存するために送信しています)をローカルシステムからアップロード/挿入しようとしています。 Play Framework/Scala を使用して Mongodb に保存します (Play 2.2.3 および 2.3.8 で試しました)。私が試してみました:

import play.api.libs.json.{JsObject, JsValue, OWrites}
import play.api.mvc.{Action, Controller}
import play.modules.reactivemongo.MongoController
import play.modules.reactivemongo.json.collection._

import scala.concurrent.ExecutionContext.Implicits.global

object Application extends Controller with MongoController {
  def jsinfocollection: JSONCollection = db.collection[JSONCollection]("mycollection")

  implicit val jsvalueWrites = new OWrites[JsValue] {
    println("implicit val jsvalueWrites ...")//getting the message on Play console
    override def writes(o: JsValue): JsObject = o match {
      case o : JsObject => o
      case _ => throw new IllegalArgumentException("Only JsObjects can be stored")
    }
  }

  def createJson = Action.async(parse.json) {
    println("createJson calling...")//getting the message on Play console
    request =>
        jsinfocollection.insert(request.body).map{
    println("jsinfocollection.insert...")//getting the message on Play console
        r => Created(s"JsonInfo is Saved with result $r")
      }
  }
}

私はMongodbでコレクションを作成しました:>db.createCollection("mycollection")

{ "ok" : 1 }

しかし、私が与えた場合: >db.mycollection.count()- 0 を与えています。それ以外の場合: db.mycollection.find()- 何も与えていません。

json データを必要なコレクション ( ) に挿入する方法を教えてください"mycollection"。前もって感謝します。

コンソールで次を取得しています。

implicit val jsvalueWrites ...
createJson calling...
jsinfocollection.insert...
[error] play - Cannot invoke the action, eventually got an error: java.lang.IllegalArgumentException: Only JsObjects can be stored

Internal server error, for (POST) [/createJson] 
4

1 に答える 1

1

Action.async(parse.json) を使用しているため、 request.body に JsValue があります

jsinfocollection は JsObject のみを格納できます (JsObject は JsValue の 1 つのタイプのみであり、他のタイプは JsArray、JsString などです)。

次のコードは、探していることを実行する必要があります

import play.api.libs.json.{JsObject, JsValue, OWrites}
import play.api.mvc.{Action, Controller}
import play.modules.reactivemongo.MongoController
import play.modules.reactivemongo.json.collection._

import scala.concurrent.ExecutionContext.Implicits.global

object Application extends Controller with MongoController {
  def jsinfocollection: JSONCollection = db.collection[JSONCollection]("mycollection")

  implicit val jsvalueWrites = new OWrites[JsValue] {
    override def writes(o: JsValue): JsObject = o match {
      case o : JsObject => o
      case _ => throw new IllegalArgumentException("Only JsObjects can be stored")
    }
  }

  def createJson = Action.async(parse.json) {
    request =>
      jsinfocollection.insert(request.body).map{
        r => Created(s"JsonInfo is Saved with result $r")
      }
  }
}

たぶん、 jsvalueWrites No Json serializerを作成する簡単な方法があるかもしれ ません。

注:文字列が有効な JsValue であることの検証はフレームワークによって parse.json で行われ、オブジェクトである検証は jsvalueWrites で行われます。完全な制御が必要な場合は、OWrites[String] を実装して parse.json を削除できます。

于 2016-03-07T16:04:53.987 に答える