reg*_*win 8 scala mongodb playframework reactivemongo
我已经开始使用Play和Play-ReactiveMongo插件,并在GET"document by 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]
Run Code Online (Sandbox Code Playgroud)
如果id参数与现有文档匹配,则下面的getById函数成功返回单个文档,如果找不到文档,则在"one [JsValue]"行上成功返回异常.
路线文件:
GET /items/:id controllers.ItemsController.getById(id: String)
Run Code Online (Sandbox Code Playgroud)
控制器对象:
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"))
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
也许我错过了文档中的内容?
这里记录了部分示例:
https://github.com/sgodbillon/reactivemongo-demo-app#simple-query
mandubian coast-to-coast示例处理BadRequest以及NotFound场景,但代码可能已过时,因为它不使用更新的查找(...).一个语义?
http://mandubian.com/2013/01/13/JSON-Coast-to-Coast/#action-get
事实证明,ID 必须是有效的 ObjectId,例如 24 个字符并且没有非法标记。
当我将行为与等效的 Node.js + Mongoose 应用程序进行比较时,结果非常相似。
例如,如果故意使用格式错误的 12 个字符 ID 进行查询,我会在 Node 中得到以下堆栈跟踪:
{ message: 'Cast to ObjectId failed for value "51bded70543f" at path "_id"',
name: 'CastError',
type: 'ObjectId',
value: '51bded70543f',
path: '_id' }
Run Code Online (Sandbox Code Playgroud)
不确定此异常是否也是 Play 应用程序中的潜在错误,但它提供了足够的线索。答案似乎是在调用 find(query).one[T] 之前预先验证 ID。
| 归档时间: |
|
| 查看次数: |
4034 次 |
| 最近记录: |