I’m using mongodb-driver-sync 4.2.3 with Java 8 and Jackson for handling JSON objects. Unfortunately, Jackson and MongoDB don’t seem to play well together, and I’m having to write my own codec for converting JsonNodes to/from Bson. I have custom classes with JsonNode properties, that I am trying to insert into MongoDB.
The issue I’m running into is that I can’t figure out how to write the JSON (either as a JsonNode or just a JSON String) to MongoDB in my codec.
/**
* Encode an instance of the type parameter {@code T} into a BSON value.
*
* @param writer the BSON writer to encode into
* @param value the value to encode
* @param encoderContext the encoder context
*/
@Override
public void encode(BsonWriter writer, JsonNode value, EncoderContext encoderContext) {
writer.writeString(value.toString());
}
This will write the JSON as a String, but I want it as an actual MongoDB Object, and not an escaped string. There does not appear to be an easy way to do this with BsonWriter. This seems like something pretty simple that shouldn’t be difficult. Any help would be appreciated; maybe I’m just approaching this wrong?
This is how my client is setup:
MongoCredential credential = MongoCredential.createCredential(...);
CodecRegistry pojoCodecRegistry = fromRegistries(
fromProviders(
new JsonNodeCodecProvider(), // My custom codec
PojoCodecProvider.builder().automatic(true).build()
),
MongoClientSettings.getDefaultCodecRegistry()
);
MongoClientSettings settings = MongoClientSettings.builder()
.codecRegistry(pojoCodecRegistry)
.credential(credential)
.applyToClusterSettings(builder ->
builder.hosts(Collections.singletonList(new ServerAddress(
// ...
))))
.build();
MongoClient client = MongoClients.create(settings);