2013-06-15 7 views
8

Ich begann Wiedergabe und die Wiedergabe-ReactiveMongo Plugin und Tests für eine 404-Antwort auf eine GET „Dokument-ID“ Szenario verwendet haben, zu finden. Leider statt Wiedergabe eine 404 NotFound Antwort Rückkehr erhalte ich diese Ausnahme:ReactiveMongo Spielen - Ausnahme bei dem Versuch, ein Dokument

java.util.NoSuchElementException: JsError.get 
     at play.api.libs.json.JsError.get(JsResult.scala:11) ~[play_2.10.jar:2.1.1] 
     at play.api.libs.json.JsError.get(JsResult.scala:10) ~[play_2.10.jar:2.1.1] 
     at play.modules.reactivemongo.json.collection.JSONGenericHandlers$StructureBufferWriter$.write(jsoncollection.scala:44) ~[play2-reactivemongo_2.10-0.9.jar:0.9] 
     at play.modules.reactivemongo.json.collection.JSONGenericHandlers$StructureBufferWriter$.write(jsoncollection.scala:42) ~[play2-reactivemongo_2.10-0.9.jar:0.9] 
     at reactivemongo.api.collections.GenericQueryBuilder$class.reactivemongo$api$collections$GenericQueryBuilder$$write(genericcollection.scala:323) ~[reactivemongo_2.10-0.9.jar:0.9] 
     at reactivemongo.api.collections.GenericQueryBuilder$class.cursor(genericcollection.scala:333) ~[reactivemongo_2.10-0.9.jar:0.9] 

Die unten erfolgreich getById Funktion gibt ein einzelnes Dokument, wenn die ID-Parameter ein vorhandenes Dokument übereinstimmt, aber eine Ausnahme auf der Linie „ein [JsValue] "Wenn das Dokument nicht gefunden wurde.

Routen Datei:

GET  /items/:id   controllers.ItemsController.getById(id: String) 

Controller-Objekt:

object ItemsController extends Controller with MongoController { 

    def itemsCollection: JSONCollection = db.collection[JSONCollection]("items") 

    def getById(id: String) = Action { 
     Async { 

       val query = Json.obj("_id" -> Json.obj("$oid" ->id)) 
       val futureItem = itemsCollection. 
       find(query). 
       one[JsValue] 

       futureItem.map { 
       case Some(item) => Ok(item) 
       case None => NotFound(Json.obj("message" -> "No such item")) 
       } 
     } 
    } 
    } 

Vielleicht habe ich etwas verpasst in der Dokumentation?

Es wird hier gezeigten Teil dokumentiert:

https://github.com/sgodbillon/reactivemongo-demo-app#simple-query

Das mandubian Küste zu Küste Beispiel Griff BadRequest auch NotFound Szenario, aber Code ist vielleicht veraltet, da es nicht die neueren nicht verwendet suchen finden (...). eine [...] Semantik?

http://mandubian.com/2013/01/13/JSON-Coast-to-Coast/#action-get

+0

anstelle von 'futureItem.map' sollte es nicht' futureItem match' sein? –

+0

nico_ekito, dieser Vorschlag kann nicht kompiliert werden. Die Ausnahme passiert sowieso früher, Play meldet sie für die Zeile "one [JsValue]". Danke für den Versuch. – reggoodwin

+4

FYI, 'future.map {}' und 'future.map (_match {})' sind äquivalent. –

Antwort

2

Schaltet die ID muss aus gültige ObjectId sein, z.B. 24 Zeichen und keine illegalen Token.

  • Wenn die ID gültig ist, aber nicht auf ein vorhandenes Dokument verweist, erhalte ich einen 404 wie erwartet.
  • Wenn das ID-Format ungültig ist (z. B. nur 12 Zeichen oder ungültige Token wie @ enthält), erhalte ich eine Ausnahme.
  • Wenn ich das Verhalten mit einer gleichwertigen Node.js + Mongoose App vergleichen, sind die Ergebnisse sehr ähnlich.

    Zum Beispiel, wenn absichtlich mit einer fehlerhaften 12 Zeichen ID Abfrage ich diesen Stacktrace in Knoten erhalten:

    { message: 'Cast to ObjectId failed for value "51bded70543f" at path "_id"', 
        name: 'CastError', 
        type: 'ObjectId', 
        value: '51bded70543f', 
        path: '_id' } 
    

    nicht sicher, ob diese Ausnahme auch im Play-App die zugrunde liegenden Fehler, aber es genug von einer Ahnung hat . Die Antwort scheint IDs vor dem Aufruf von find (query) .one [T] zu validieren.

    Verwandte Themen