Вставка POJO с полем JsonNode в MongoDB с использованием драйвера Java - PullRequest
0 голосов
/ 16 мая 2018

Я использую драйвер 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

1 Ответ

0 голосов
/ 27 августа 2018

Я столкнулся с той же проблемой здесь и решил с помощью ObjectMapper.

Используйте ниже:

ObjectMapper mapper =   new ObjectMapper();
Map inputMap        =   mapper.convertValue(jsonNode, Map.class);
...