簡體   English   中英

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

[英]play2 framework mongodb : [NoSuchElementException: None.get]

我在嘗試使用mongodb在游戲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,

也許有人會指引我正確的方向。

謝謝!

這不是編譯時錯誤,而是運行時錯誤,這意味着您嘗試將作為Boat進行反序列化的文檔對讀者不可讀。

這可能是因為文檔中沒有字段“ accomodation”,或者它的值無法通過您的Accomodation閱讀器反序列化為Accomodation實例。 這導致getAs[A](name)返回None

調用.get on 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可能會保留有關錯誤的詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM