0

私は次のクラスを持っています:

case class DeviceRegistration(deviceData: DeviceData,
                              pin: String,
                              created: DateTime) {}

タイプDeviceDataは単純に 4 つの文字列フィールドとして定義されます。

DeviceRegistration型をmongo コレクションに挿入しようとして失敗しました。日付が NumberLong ではなく ISODate として保存されるようにしたいので、カスタム リーダーとライターを実装しました。

  implicit object DeviceDataWriter extends BSONDocumentWriter[DeviceData] {
    def write(data: DeviceData): BSONDocument = BSONDocument(
      DEVICE_ID_KEY -> data.deviceId,
      MODEL_KEY -> data.model,
      BRAND_KEY -> data.brand,
      MANUFACTURER_KEY -> data.manufacturer)
  }

  implicit object DeviceRegistrationWriter extends BSONDocumentWriter[DeviceRegistration] {
    def write(registration: DeviceRegistration): BSONDocument = BSONDocument(
      DEVICE_DATA_KEY -> registration.deviceData,
      PIN_KEY -> registration.pin,
      CREATED_KEY -> BSONDateTime(registration.created.getMillis))
  }

  implicit object DeviceDataReader extends BSONDocumentReader[DeviceData] {
    def read(doc: BSONDocument): DeviceData = {
      val deviceId = doc.getAs[String](DEVICE_ID_KEY).get
      val model = doc.getAs[String](MODEL_KEY)
      val brand = doc.getAs[String](BRAND_KEY)
      val manufacturer = doc.getAs[String](MANUFACTURER_KEY)
      DeviceData(deviceId, model, brand, manufacturer)
    }
  }

  implicit object DeviceRegistrationReader extends BSONDocumentReader[DeviceRegistration] {
    def read(doc: BSONDocument): DeviceRegistration = {
      val deviceData = doc.getAs[DeviceData](DEVICE_DATA_KEY).get
      val pin = doc.getAs[String](PIN_KEY).get
      val created = doc.getAs[BSONDateTime](CREATED_KEY).map(dt => new DateTime(dt.value))
      DeviceRegistration(deviceData, pin, created.get)
    }
  }

次のコードでドキュメントを挿入しようとしています:

  def save(deviceRegistration: DeviceRegistration): Future[DeviceRegistration] = {
    deviceRegistrations.insert(deviceRegistration).map(result => deviceRegistration)
  }

取得するために、私はこれをやっています:

  def findDeviceRegistrationRequest(deviceConfirmationData: DeviceConfirmationData) = {
    deviceRegistrations.find(BSONDocument("pin" -> deviceConfirmationData.pin))
      .one[DeviceRegistration](ReadPreference.Primary)
  }

レコードは次のように保存されます。

{ "_id" : ObjectId("56dea8d0d8cadd6ff70690d8"), "deviceData" : { "deviceId" : "kdsajkldjsalkda" }, "pin" : "9914", "created" : NumberLong("1457432783921") }

作成日は明らかに私のライターによってシリアル化されていません。reactmongo はデフォルトのライターを使用しているようです。

同様に、読むと例外が発生します。

Caused by: java.lang.RuntimeException: (/created,List(ValidationError(List(error.expected.date),WrappedArray())))

したがって、明らかに私のリーダーも使用していません。

グーグルで検索する運はありませんでした。私は何が欠けていますか?

また、(暗黙的なメカニズムに頼るのではなく) 使用したいライターとリーダーを具体的に設定する方法を見つけようとしましたが、それを理解することができませんでした。

正しい方向へのポインタは非常に高く評価されます。

4

0 に答える 0