0

Play 2.1.5 で mongodb を使用して 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)
  }
}

これらのキーがmongodbレコードにない可能性があるため、一部のフィールドで「Option [String]」を使用しています。その場合、scala オブジェクトで空の値を返したいと思います。

これにより、コンパイル時に次のエラーが発生します。

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

多分誰かが私を正しい方向に向けるでしょう。

ありがとう!

4

1 に答える 1

1

これはコンパイル時エラーではなく、Boat としてデシリアライズしようとしているドキュメントがリーダーで読み取れないことを意味するランタイム エラーです。

これは、ドキュメントにフィールド「accomodation」がないか、Accomodation リーダーで Accomodation のインスタンスに逆シリアル化できない値を持っている可能性があります。getAs[A](name)これは戻ることにつながりNoneます。

.getonNoneを呼び出すとNoSuchElementException、一般に、Options で .get を呼び出すのは悪い習慣と見なされます。代わりに、常に 2 つの可能な選択肢を処理する必要があります。オプションがどのように機能するかについては、次の例を参照してください

BSONDocument.getAsTry[A](name)代わりに を使用することで、何が問題なのかについての詳細情報を取得できる可能性がSuccessありFailますFail

于 2014-03-13T09:45:03.487 に答える