0

我是新來的Reactivemongo數據庫(2.6),因爲我試圖上傳/插入json對象(這是鍵/值對,我發送它存儲在數據庫中,點擊我的用戶界面中的提交按鈕)從我的使用Play Framework/Scala在Mongodb中存儲localsystem(使用Play 2.2.3和2.3.8進行試用)。我曾嘗試:無法調用動作,最終出現錯誤:java.lang.IllegalArgumentException:只有JsObjects可以存儲在Play框架中嗎?

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] 
+0

您正在使用Play和ReactiveMongo的老版本。 – cchantep

+0

@cchantep,當我使用Play(2.2.3)和Mongo(2.6)時,我是否可以知道它的任何解決方案。 – Dhana

+0

我懷疑你會得到許多社區支持與棄用版本 – cchantep

回答

1

當您使用Action.async(parse.json)你有JsValue在request.body

jsinfocollection只能夠存儲JsObjects(JsObjects只有一種類型的JsValues的,其他類型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 as JsObject found for type play.api.libs.json.JsObject 也許更新到最新版本更簡單的方法可以幫助

注:驗證該字符串是一個有效的JsValue將通過解析框架內完成。 json,驗證是一個對象在jsvalueWrites中完成,如果您需要完全控制,您可以實現OWrites [String]並刪除parse.json

+0

感謝您的回覆,我已經嘗試了以上的事情,但我得到的錯誤如:value asJson不是play.api.libs.json.JsValue的成員,我更新了相同的問題和描述。我正在使用Play 2.2.3和MongoDB 2.6。請告訴我。 – Dhana

+0

對不起。當你在做Action.async(parse.json)時,你已經在request.body中有了一個JsValue。驗證將在您的代碼之外完成。我會更新我的回答 –

+0

是的,當然,請讓我知道。提前致謝。 – Dhana

相關問題