Playframework 2.0 play2框架mongodb:[NoTouchElementException:None.get]

Playframework 2.0 play2框架mongodb:[NoTouchElementException:None.get],playframework-2.0,mongodb-scala,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, (...) ) } 然

我很难用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/acomodation.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对象中返回en空值

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

[NoSuchElementException: None.get]
doc.getAs[Accomodation]("accomodation").get,
也许有人会给我指出正确的方向


塔克斯

这不是编译时错误,而是一个运行时错误,这意味着您试图反序列化为船的文档无法被您的读者读取

这可能是因为文档中没有字段“accomodation”,或者它的值无法通过accomodation reader反序列化为accomodation实例。这导致
getAs[A](名称)
返回
None

调用
.get
on
None
会给您带来
NoTouchElementException
一般来说,调用被认为是不好的做法。相反,您应该始终处理这两种可能的选择。您可以在此处阅读有关选项工作原理的更多信息,例如:


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

谢谢Johan给出的明确答案。我会继续努力,如果我成功了会发回的。