Вставка POJO с полем JsonNode в MongoDB с использованием драйвера Java

Я использую драйвер 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, но он никогда не использовался mongo. Это мой кодек -

@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.

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
0
1 421
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

Просто добавьте настраиваемые конвертеры для преобразования объекта JsonNode в org.bson.Document и наоборот. Сохраняйте классы POJO / Document так, как они есть с полями JsonNode. При использовании пружины:

@Bean
public MongoCustomConversions mongoCustomConversions() {
    List<Converter<?, ?>> converters = new ArrayList<>();
    converters.add(JsonNodeToDocumentConverter.INSTANCE);
    converters.add(DocumentToJsonNodeConverter.INSTANCE);
    return new MongoCustomConversions(converters);
}

@WritingConverter
enum JsonNodeToDocumentConverter implements Converter<JsonNode, Document> {
    INSTANCE;

    public Document convert(JsonNode source) {
        if (source == null)
            return null;

        return Document.parse(source.toString());
    }
}

@ReadingConverter
enum DocumentToJsonNodeConverter implements Converter<Document, JsonNode> {
    INSTANCE;

    public JsonNode convert(Document source) {
        if (source == null)
            return null;

        ObjectMapper mapper = new ObjectMapper();
        try {
            return mapper.readTree(source.toJson());
        } catch (IOException e) {
            throw new RuntimeException("Unable to parse DbObject to JsonNode", e);
        }
    }
}

Другие вопросы по теме