Description
Summary
The codec for a case class generated using a macro is unable to decode a case class containing a Map where a key in the Map is the same as a field in the case class and the type of the values are not the same. For example the case class field is an integer and the map field is a string. This currently fails with an exception. The expected outcome is that decoding works. See below example.
Please provide the version of the driver. If applicable, please provide the MongoDB server version and topology (standalone, replica set, or sharded cluster).
Java 11
Scala 2.12.15
mongo-scala-driver 4.6.0
mongodb-driver-sync 4.6.0
How to Reproduce
import org.bson.codecs.configuration.CodecRegistries.fromProviders |
import org.bson.codecs.DecoderContext |
import org.bson.json.JsonReader |
import org.mongodb.scala.MongoClient.DEFAULT_CODEC_REGISTRY |
import org.mongodb.scala.bson.codecs.Macros._ |
|
case class Model(field: Int, map: Map[String, String]) |
|
object Reproducer extends App { |
|
val registry = fromProviders(
|
createCodecProvider[Model],
|
DEFAULT_CODEC_REGISTRY
|
)
|
|
val json =
|
"""{ |
| "field": 1, |
| "map": { |
| "field": "value" |
| }
|
|}""".stripMargin |
|
print(registry.get(classOf[Model], registry).decode(new JsonReader(json), DecoderContext.builder.build)) |
|
}
|
Additional Background
The above code results in the exception:
_Exception in thread "main" org.bson.BsonInvalidOperationException: Invalid numeric type, found: STRING at org.bson.codecs.NumberCodecHelper.decodeInt(NumberCodecHelper.java:59) at org.bson.codecs.IntegerCodec.decode(IntegerCodec.java:38) at org.bson.codecs.IntegerCodec.decode(IntegerCodec.java:29) at org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec.readValue(MacroCodec.scala:193) at org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec.readValue$(MacroCodec.scala:179) at Reproducer$$anon$1$ModelMacroCodec$1.readValue(Reproducer.scala:12) at org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec.readDocument(MacroCodec.scala:250) at org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec.readDocument$(MacroCodec.scala:227) at Reproducer$$anon$1$ModelMacroCodec$1.readDocument(Reproducer.scala:12) at org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec.readValue(MacroCodec.scala:188) at org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec.readValue$(MacroCodec.scala:179) at Reproducer$$anon$1$ModelMacroCodec$1.readValue(Reproducer.scala:12) at org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec.decode(MacroCodec.scala:107) at org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec.decode$(MacroCodec.scala:96) at Reproducer$$anon$1$ModelMacroCodec$1.decode(Reproducer.scala:12) at Reproducer$.delayedEndpoint$Reproducer$1(Reproducer.scala:24) at Reproducer$delayedInit$body.apply(Reproducer.scala:9) at scala.Function0.apply$mcV$sp(Function0.scala:39) at scala.Function0.apply$mcV$sp$(Function0.scala:39) at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17) at scala.App.$anonfun$main$1$adapted(App.scala:80) at scala.collection.immutable.List.foreach(List.scala:431) at scala.App.main(App.scala:80) at scala.App.main$(App.scala:78) at Reproducer$.main(Reproducer.scala:9) at Reproducer.main(Reproducer.scala)_ |