使用Java驱动程序将带有JsonNode字段的POJO插入MongoDB [英] Inserting a POJO with a JsonNode field into MongoDB using Java driver

查看:198
本文介绍了使用Java驱动程序将带有JsonNode字段的POJO插入MongoDB的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Mongo Java驱动程序3.7

Im using Mongo Java driver 3.7

这是我的POJO(带有getter和setter) -

This is my POJO(with getters and setters) -

public class Sample{
    public int field1;
    public JsonNode field2;
}

我使用下面的代码将Sample的对象插入MongoDB。

Im using the below code to insert an object of Sample into 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是使用适当的数据创建的。但插入行为是行为不端。
我想我在这里错过了一些东西。任何潜在客户都赞赏。

Note: In debug mode, it is clear that the JsonNode is created with proper data. But insert is misbehaving. I guess I'm missing something here. Any leads appreciated.

更新:
我尝试为JsonNode类编写自定义编解码器,但它永远不会被mongo使用。这是我的编解码器代码 -

Update: I tried writing a custom codec for JsonNode class, but it is never being used by mongo. This is my codec code -

@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;
    }
}

我正在注册这样的编解码器 -

And I'm registering the codec like this -

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对象

PS: Other codecs registered for custom POJOs are working fine. But this codec is never being used to encode/decode JSON objects

推荐答案

我在这里遇到了同样的问题并使用ObjectMapper解决了。

I was facing the same issue here and resolved using ObjectMapper.

使用以下:

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

这篇关于使用Java驱动程序将带有JsonNode字段的POJO插入MongoDB的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆