2015-06-30 3 views
19

Ho il seguente codice che funziona in una console app quando si fa riferimento "org.reactivemongo" %% "play2-reactivemongo" % "0.10.5.0.akka23"No JSON serializzatore come JSObject trovato per il tipo play.api.libs.json.JsObject

quando aggiorno il riferimento a "org.reactivemongo" % "play2-reactivemongo_2.11" % "0.11.0.play23-M3" ottengo:

Nessun serializzatore Json come JsObject trovato per tipo play.api.libs.json.JsObject. Prova ad implementare un OWrites o uno OFormat implicito per questo tipo.

import org.joda.time.DateTime 
import reactivemongo.bson.BSONObjectID 
import play.modules.reactivemongo.json.BSONFormats._ 

case class GoogleToken 
(
    id: Option[BSONObjectID], 
    name: String, 
    emailAddress: String, 
    refreshToken: String, 
    expires: DateTime 
) 

object GoogleToken { 

    import play.api.libs.json.Json 

    // Generates Writes and Reads 
    implicit val googleTokenFormat = Json.format[GoogleToken] 
} 

e poi

collezione val = db.collectionJSONCollection

val query = Json.obj() 
val cursor = collection.find(query). 
    cursor[GoogleToken](ReadPreference.nearest). 
    collect[List]() 

Che cosa sto facendo di sbagliato?

+0

Quindi non posso Ricreare, ma confrontando queste due versioni, la maggior parte delle dipendenze è rimasta la stessa, ma mongo reattivo ha aggiornato le loro librerie interne. Per quello che vale il messaggio che riceverai da ImplicitNotFound su OWrites. Sta cercando di prendere un'istanza del tuo tipo/classe e creare un JsObject. Quando dici app per console - hai creato app o è presente nel repl? Non ho visto i nomi dei pacchetti sopra ma forse sono solo frammenti. – Barry

+0

Mi chiedo se qualcosa è cambiato nella libreria dove vuole un JsObject e il formato sopra sulla classe case sta solo creando letture/scritture. – Barry

+0

^^ sopra è errato è andato attraverso la fonte e richiede solo scritture – Barry

risposta

20

È stata pubblicata la versione finale di ReactiveMongo 0.11 ("org.reactivemongo" %% "play2-reactivemongo" % "0.11.0.play23").

Come indicato sullo updated documentation, per le conversioni BSON/JSON predefinite, si consiglia di avere: import play.modules.reactivemongo.json._, ImplicitBSONHandlers._.

+2

import play.modules.reactivemongo.json._ ha fatto il trucco! Grazie! –

+0

Si noti che la versione del modulo per Play 2.4 è '0.11.0.play24'. – cchantep

+1

con '0.11.2.play23', devo fare ' import play.modules.reactivemongo.json.ImplicitBSONHandlers._' –

5

Nel mio caso, stavo alimentando ReactiveMongo (insert) con uno JsValue anziché JsObject. Al fine di risolvere il problema, dietro l'aggiunta di import play.modules.reactivemongo.json._, ho anche dovuto cambiare il mio implicita Writes in OWrites:

da

implicit val myWrites: Writes[A] = new Writes[A] { 
    def writes(a: A) = Json.obj(...) 

a

implicit val myWrites: OWrites[A] = new OWrites[A] { <-- NOTE THE 'O' before 'Writes' 
    def writes(a: A) = Json.obj(...) 
+0

Il 'OWrites' è raccomandato quando è richiesta la specificità della scrittura di un oggetto. Non appena scrivi un 'JsObject', è una buona idea. – cchantep

+1

Se usi Play with ReactiveMongo, questa è la soluzione che ti serve. Ho cambiato tutto il mio 'Format' in' Oformat' (devi specificare il tipo) e ha funzionato. Esempio: 'Person caso classe (name: String, età: Int) oggetto Person { implicita val jsonFormat: OFormat [persona] = Json.format [persona] } ' Avviso O in OFormat. – borice

5

miniera ha funzionato dopo l'aggiunta: gioco import .modules.reactivemongo.json._ import play.modules.reactivemongo.json.collection._