Я использую драйвер Mongo Java 3.7
Это мой POJO (с геттерами и сеттерами) -
public class Sample{
public int field1;
public JsonNode field2;
}
Я использую приведенный ниже код для вставки объекта Sample в MongoDB.
MongoCollection<Sample> myCollection = database.getCollection("myCollection",Sample.class);
ObjectMapper mapper = new ObjectMapper();
Sample obj = new Sample();
obj.setField1(1);
String sampleJSON = "{ \"key\": \"value\" }";
obj.setField2(mapper.readTree(sample));
myCollection.insertOne(obj);
Видимый вывод: ( Поле JsonNode пусто )
{
"_id" : ObjectId("5afbff8a8f621e1e328a8c4e"),
"field1" : 1
"field2" : [
[ ]
],
}
Примечание. В режиме отладки очевидно, что JsonNode создается с правильными данными.Но вставка ведет себя плохо.Я думаю, что я что-то здесь упускаю.Любые лиды приветствуются.
Обновление: Я пытался написать собственный кодек для класса JsonNode, но он никогда не использовался Монго.Это код моего кодека -
@Slf4j
public class JsonNodeCodec implements CollectibleCodec<JsonNode> {
@Inject
private ObjectMapper objectMapper;
@Override
public JsonNode generateIdIfAbsentFromDocument(JsonNode jsonNode) {
return null;
}
@Override
public boolean documentHasId(JsonNode jsonNode) {
return false;
}
@Override
public BsonValue getDocumentId(JsonNode jsonNode) {
return null;
}
@Override
public JsonNode decode(BsonReader reader, DecoderContext decoderContext) {
String task = reader.readString();
JsonNode node = objectMapper.readTree(task);
return node;
}
@Override
public void encode(BsonWriter writer, JsonNode jsonNode, EncoderContext encoderContext) {
writer.writeString(jsonNode.toString());
}
@Override
public Class<JsonNode> getEncoderClass() {
return JsonNode.class;
}
}
И я регистрирую кодек следующим образом -
Codec<JsonNode> jsonNodeCodec = new JsonNodeCodec();
CodecRegistry codecRegistry = CodecRegistries.fromRegistries(com.mongodb.MongoClient.getDefaultCodecRegistry(),
CodecRegistries.fromCodecs(jsonNodeCodec),
CodecRegistries.fromProviders(PojoCodecProvider.builder().automatic(true).build())
);
PS: Другие кодеки, зарегистрированные для пользовательских POJO, работают нормально.Но этот кодек никогда не используется для кодирования / декодирования объектов JSON