0

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

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

implicit object BoatBSONReader extends BSONDocumentReader[Boat] {
 def read(doc: BSONDocument): Boat =
  Boat(
  (...)
  doc.getAs[Accomodation]("accomodation").get,
  (...)
 )
}

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

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

我在某些字段上使用“Option [String]”,因为 mongodb 记录中可能缺少这些键。在这种情况下,我想在我的 scala 对象中返回一个空值。

这在编译时导致此错误:

[NoSuchElementException: None.get]
doc.getAs[Accomodation]("accomodation").get,

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

谢谢!

4

1 回答 1

1

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

这可能是文档中没有“住宿”字段,或者它的值无法使用您的住宿阅读器反序列化为住宿实例。这导致getAs[A](name)返回None

通常,调用.get on Options 被认为是一种不好的做法,相反,您应该始终处理两种可能的.get选择NoneNoSuchElementException您可以在此处阅读有关 Option 工作原理的更多信息,例如:http ://danielwestheide.com/blog/2012/12/19/the-neophytes-guide-to-scala-part-5-the-option-type.html

您可能会通过使用来获得有关错误的更多信息,BSONDocument.getAsTry[A](name)因为它返回或者Success可能会保留有关错误的详细信息。FailFail

于 2014-03-13T09:45:03.487 回答