【发布时间】:2014-06-20 23:04:45
【问题描述】:
我尝试从 Play 2.3 中的 POST 获取有效负载。
所以我用这个表达方式。
val name = request.body.asFormUrlEncoded.get("name").flatMap(_.headOption)
但是当“名称”字段不存在时,我遇到了麻烦。使用调试器,我可以看到 request.body.asFormUrlEncoded 的类型是 Some(Map) 还是 ListMap?我不确定,在调试器中会显示这两个术语。当字段“name”存在时,一切正常,但如果字段“name”缺失,则会抛出 NoSuchElementException。
我可以看到只有调用 request.body.asFormUrlEncoded.get("name") 会返回一个 ArrayBuffer。但是如果“名称”字段不存在,它不应该返回 Some(ArrayBuffer) 和 None 吗?
那么如果字段丢失,我该怎么做才能查询字段的值而不产生异常。
添加: 这是 AnyContentAsFormUrlEncoded 的声明。所以它是一个地图。但是 get on a Map 应该返回 Some 或 None,而不是直接返回对象。
case class AnyContentAsFormUrlEncoded(data: Map[String, Seq[String]]) extends AnyContent
【问题讨论】:
-
为什么不能为该异常设置一个处理程序?知道该字段是否确实存在并让您的程序在它不存在时处理这种情况是一件好事。
-
不是这样的。当然我可以把它放在一个 try catch 块中。但并非只有次优解决方案例外。 - 我在 REPL 中玩过,如果我在那里有一个 Map 并在上面调用 get("xxx") 并且地图中没有 xxx,它会返回一个 None。否则我会得到一些(任何东西)。那么问题来了,为什么 FormUrlEncoded 的 Map 上的“get”没有返回 Option?在 Map 或 ListMap 上“get”的 scala 文档中,它说“get”返回一个选项。
标签: scala map playframework nosuchelementexception