2013-06-15 8 views
8

मैं प्ले का उपयोग शुरू कर दिया है और प्ले-ReactiveMongo प्लगइन और परिदृश्य "आईडी द्वारा दस्तावेज़" किसी GET पर 404 प्रतिक्रिया के लिए परीक्षण खोजने की कोशिश। 404 NotFound प्रतिक्रिया लौटाएँ प्ले के दुर्भाग्य के बजाय मैं इस अपवाद:प्ले ReactiveMongo - अपवाद है जब एक दस्तावेज़

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] 

getById समारोह नीचे सफलतापूर्वक एक एकल दस्तावेज़ लौटाता है यदि आईडी पैरामीटर किसी मौजूदा दस्तावेज़ से मेल खाता है, लेकिन लाइन "पर एक अपवाद एक [JsValue] "अगर दस्तावेज़ नहीं मिला।

रूट फ़ाइल:

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

नियंत्रक वस्तु:

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")) 
       } 
     } 
    } 
    } 

शायद मैं डॉक्स में कुछ छूट गया हो?

वहाँ आंशिक उदाहरण यहाँ प्रलेखित है:

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

mandubian तट से तट उदाहरण BadRequest रूप में अच्छी तरह NotFound परिदृश्य संभालती है, लेकिन कोड पुराना हो चुका शायद है, क्योंकि यह नए प्रयोग नहीं करता है खोज रहे हैं (...)। एक [...] अर्थशास्त्र?

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

+0

'futureItem.map' के बजाय यह' भविष्य के मैच मैच 'नहीं होना चाहिए? –

+0

nico_ekito, वह सुझाव संकलन करने में विफल रहता है। अपवाद पहले भी होता है, प्ले लाइन "एक [जेएसवेल्यू]" के लिए रिपोर्ट करता है। कोशिश करने के लिए धन्यवाद। – reggoodwin

+4

एफवाईआई, 'future.map {}' और 'future.map (_ match {})' समकक्ष हैं। –

उत्तर

2

बाहर कर देता है ID एक मान्य ObjectId, उदा होने की जरूरत है 24 अक्षर और कोई अवैध टोकन नहीं।

  • यदि आईडी मान्य है लेकिन मौजूदा दस्तावेज़ का संदर्भ नहीं देती है तो मुझे उम्मीद के अनुसार 404 मिलते हैं।
  • यदि आईडी प्रारूप अमान्य है (उदा। केवल 12 वर्ण या '@' जैसे अवैध टोकन हैं) तो मुझे अपवाद मिलता है।

जब मैं समकक्ष नोड.जेएस + मोंगोस ऐप के साथ व्यवहार की तुलना करता हूं तो परिणाम बहुत समान होते हैं।

उदाहरण के लिए यदि जानबूझ कर एक विकृत 12 चरित्र आईडी मैं नोड में इस स्टैकट्रेस पाने के द्वारा क्वेरी:

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

सुनिश्चित नहीं हैं कि अगर यह अपवाद भी Play ऐप्लिकेशन में अंतर्निहित त्रुटि है, लेकिन यह एक सुराग के लिए पर्याप्त दे दी है । उत्तर (क्वेरी) कॉल करने से पहले उत्तर पूर्व-मान्य आईडी प्रतीत होता है। एक [टी]।

संबंधित मुद्दे