Missing Codecs in MongoDB
When upgrading a project’s Mongo driver from 2.13.0 to 3.4.2, we got the following exception:
org.bson.codecs.configuration.CodecConfigurationException: can't find a codec for class java.math.BigDecimal.
Well it seems that Mongo doesn’t support BigDecimal any longer. There we made our own BigdDecimal Codec. If you search for the “can't find a codec for class
” error, you inevitably end up at this StackOverflow entry. However that is about saving nested, custom objects into Mongo. If you search for a while longer you will end up in the Mongo docs that has a simple example with Integer
. Seems easy to adopt that for BigDecimal.
But when we did that, we got the same error. it seemed like Mongo was just ignoring our call to the CodecRegistry
! The problem was what is described here – we were using a BasicDBObject
and not a Document
so the Mongo driver wasn’t hitting the CodecRegistry
.
I made a Gist overview of how we got it working. The key was adding the Transformer
via the static class with this line: BSON.addEncodingHook(BigDecimal.class, new BigDecimalTransformer());
. We needed both that Transformer
and the Codec
in the registry for it to work.
I hope that this post can save someone else a few hours/days of head-scratching.
Thanks a lot for this post! Had a similar problem when upgraded Apache Camel to a new version (which also includes upgrade of MongoDB Driver), which broke the software I was working on. Camel community pointed out that this is “wanted-by-design” by the new mongo driver, but that didn’t help getting my code work again.
Than I Implemented a BigDecimal codec like you suggested in your GIST example, worked like a charm!
So, indeed, your post saved me a LOT “hours/days of head-scratching” :)!
I’m glad my post helped! The fix is not intuitive.
Many thanks! Really good work!