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 JsonNode
s 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);