首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >play2框架mongodb:[NoSuchElementException: None.get]

play2框架mongodb:[NoSuchElementException: None.get]
EN

Stack Overflow用户
提问于 2014-03-13 17:03:25
回答 1查看 798关注 0票数 0

我很难用mongodb在play 2.1.5上创建我的BSON阅读器/写入器。

下面是app/model/Boat.scala中的代码摘录:

代码语言:javascript
运行
复制
implicit object BoatBSONReader extends BSONDocumentReader[Boat] {
 def read(doc: BSONDocument): Boat =
  Boat(
  (...)
  doc.getAs[Accomodation]("accomodation").get,
  (...)
 )
}

然后在app/model/Accomodation.scala中我有:

代码语言:javascript
运行
复制
case class Accomodation(number_cabins: Int, cabin_configuration: Option[String], bed_configuration: Option[String], number_guest: Int)
(...)
implicit object AccomodationBSONReader extends BSONDocumentReader[Accomodation] {
 def read(doc: BSONDocument): Accomodation =
  Accomodation(
   doc.getAs[Int]("number_cabins").get,
   doc.getAs[String]("cabin_configuration"),
   doc.getAs[String]("bed_configuration"),
   doc.getAs[Int]("number_guest").get)
  }
}

我在一些字段上使用了"OptionString“,因为这些键可能会在mongodb记录中丢失。在这种情况下,我想在我的scala对象中返回en空值。

这会在编译时导致此错误:

代码语言:javascript
运行
复制
[NoSuchElementException: None.get]
doc.getAs[Accomodation]("accomodation").get,

也许有人会给我指明正确的方向。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2014-03-13 17:45:03

这不是一个编译时错误,而是一个运行时错误,这意味着您试图反序列化为Boat的文档对于您的读者是不可读的。

这可能是因为文档中没有字段" Accomodation“,也可能是它的值不能被反序列化为Accomodation阅读器的Accomodation实例。这导致getAs[A](name)返回None

None上调用.get会给你一个选项。一般来说,在选项上调用.get被认为是不好的做法,相反,你应该始终处理两种可能的选择。您可以在此处阅读有关选项工作原理的更多信息,例如:http://danielwestheide.com/blog/2012/12/19/the-neophytes-guide-to-scala-part-5-the-option-type.html

您可能会通过使用BSONDocument.getAsTry[A](name)来获取有关错误的更多信息,因为这将返回SuccessFail,其中Fail可能会保存有关错误的详细信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22373654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档