play2 framework mongodb:[NoSuchElementException:None.get]

时间:2014-03-13 09:03:25

标签: playframework-2.0 mongodb-scala

我很难用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)
  }
}

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

这在编译时导致此错误:

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

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

Thanx!

1 个答案:

答案 0 :(得分:1)

这不是编译时错误,它是一个运行时错误,意味着您尝试反序列化为Boat的文档无法与读者一起阅读。

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

.get上拨打None会给你一个NoSuchElementException一般来说,在选项上调用.get被认为是不好的做法,相反,你应该总是处理两种可能的选择。您可以在此处详细了解Option的工作原理,例如:http://danielwestheide.com/blog/2012/12/19/the-neophytes-guide-to-scala-part-5-the-option-type.html

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