Joda DateTimeって最近はもうトレンドじゃない?
とにもかくにも、今現在進行形で使っていてMongoDBにISODateとして保存したい。
けど流石に公式サポートされてる型じゃないんでCan't find a codec for class org.joda.time.DateTime.って怒られちゃいます。(下記コード)
わざわざ文字列にするのもあれだし、ということでスマートにコーデックを作る方法です。

import org.mongodb.scala._
import org.mongodb.scala.bson.codecs.Macros._
import org.mongodb.scala.bson.codecs.DEFAULT_CODEC_REGISTRY
import org.bson.codecs.configuration.CodecRegistries.{fromRegistries, fromProviders}
import scala.concurrent.duration._
import org.joda.time.{DateTime, DateTimeZone}
import org.joda.time.format.DateTimeFormat

case class Post(title: String, body: String, createAt: DateTime)

val tz = DateTimeZone.forID("Asia/Tokyo")
val format = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").withZone(tz)

val codecRegistry = fromRegistries(fromProviders(classOf[Post]), DEFAULT_CODEC_REGISTRY)
val uri = "mongodb://root:password@localhost:27017/?authSource=admin"
val db = MongoClient(uri).getDatabase("example_db")
val posts: MongoCollection[Post] = db.withCodecRegistry(codecRegistry).getCollection("posts")

val post = Post("記事のタイトル", "本文だよ!", format.parseDateTime("2020-10-01 10:00:00"))

// 【ここでエラー!】 org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class org.joda.time.DateTime.
Await.result(posts.insertOne(post).toFuture, 1 second)

続きを読む