Skip to content

Instantly share code, notes, and snippets.

@aaabramov
Last active December 21, 2020 12:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aaabramov/89625595893d0ff513d1512b43a21caa to your computer and use it in GitHub Desktop.
Save aaabramov/89625595893d0ff513d1512b43a21caa to your computer and use it in GitHub Desktop.
Mongo Integer ClassCastException issue
package the
import org.bson.codecs.configuration.CodecRegistries.fromRegistries
import org.mongodb.scala.MongoClient.DEFAULT_CODEC_REGISTRY
import org.mongodb.scala.bson.BsonInt64
import org.mongodb.scala.{Document, MongoClient}
import scala.concurrent.Await
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
// SCALA-592
// https://jira.mongodb.org/browse/SCALA-592
object MongoIssue extends App {
protected val mongoClient: MongoClient = MongoClient(s"mongodb://localhost:27017")
private val coll =
mongoClient.getDatabase("MyDB").withCodecRegistry(fromRegistries(DEFAULT_CODEC_REGISTRY)).getCollection[Document]("test_collection")
//@formatter:off
val p = for {
inserted <- coll.insertOne(Document("field" -> BsonInt64(1L))).toFuture()
_ = println(inserted)
found <- coll.find().head()
_ = println(found)
_ = println(found.getLong("field"))
} yield found
Await.result(p, 10.seconds)
//@formatter:on
}
// Results in an exception:
/*
AcknowledgedInsertOneResult{insertedId=BsonObjectId{value=5fe089b45e52e211a27dc3a4}}
Document((_id,BsonObjectId{value=5fe089b45e52e211a27dc3a4}), (field,BsonInt64{value=1}))
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
at org.bson.Document.getLong(Document.java:267)
at the.MongoIssue$.$anonfun$p$4(MongoIssue.scala:25)
at scala.util.Success.$anonfun$map$1(Try.scala:255)
at scala.util.Success.map(Try.scala:213)
at scala.concurrent.Future.$anonfun$map$1(Future.scala:292)
at scala.concurrent.impl.Promise.liftedTree1$1(Promise.scala:33)
at scala.concurrent.impl.Promise.$anonfun$transform$1(Promise.scala:33)
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:64)
at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:175)
*/
@aaabramov
Copy link
Author

aaabramov commented Dec 21, 2020

Root cause is described in the comments: https://jira.mongodb.org/browse/SCALA-592

As a temporary fix, fallback to native scala Document method get[BsonInt64].getValue and its friends. It would also avoid heavy implicit conversions to java Document via JSON

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment