Play ReactiveMongo - 尝试查找一个文档时出现异常

时间:2013-06-15 19:06:44

标签: mongodb scala playframework reactivemongo

我已经开始使用 Play Play-ReactiveMongo 插件,并在GET“文档按ID”方案中测试404响应。不幸的是,而不是Play返回404 NotFound响应,我得到了这个例外:

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]

如果id参数与现有文档匹配,则下面的getById函数成功返回单个文档,如果找不到文档,则在“one [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 coast-to-coast示例处理BadRequest以及NotFound场景,但代码可能已过时,因为它不使用较新的查找(...)。一个语义?< / p>

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

1 个答案:

答案 0 :(得分:2)

证明ID必须是有效的ObjectId,例如24个字符,没有非法令牌。

  • 如果ID有效但未引用现有文档,则我会按预期获得404.
  • 如果ID格式无效(例如只有12个字符或包含非法令牌,如'@'),我会收到例外情况。

当我将行为与等效的Node.js + Mongoose app进行比较时,结果非常相似。

例如,如果故意使用格式错误的12个字符ID进行查询,我会在Node中获得此堆栈跟踪:

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

不确定此异常是否也是Play应用中的潜在错误,但它提供了足够的线索。 在调用find(query).one [T]。

之前,答案似乎是预验证ID