解决 Java MongoDB Driver 中 Update 方法的Bug

问题:

使用 Java MongoDB Driver < version: 3.2.2 > 的过程中,Updates 方法(MongoDB API Docs)会出现一个棘手的问题。
比如 set("data", userData) , 当 userData 类型为 Java 中的集合时(例如 JSONArray),程序会抛出 org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class JSONArray. 异常。


解决方案:

这是由于,MongoDriver所有操作的基本数据类型都为Bson, 而其没有内嵌 将 JSONArray 转换为 BsonArray 的方法,这就需要我们自己动手做类型转换。

        JSONArray userData = JSONArray.parseArray(userDataObj);
        BsonArray bsonArray = new BsonArray();
        JSONObject jo;
        for (int i = 0; i < userData.size(); i++) {
            jo = userData.getJSONObject(i);
            BsonDocument document = new BsonDocument();
            if (!jo.isEmpty()) {
                Set<String> set = jo.keySet();
                for (String key : set) {
                    document.put(key, BsonTool.objectToBsonValue(jo.get(key)));
                }
            }
            bsonArray.add(document);
        }

BsonArray 的子数据类型为 BsonValue,我们需要将 JSONArray中的 Java基础类型 转换为 BsonValue 类型,所以我自定义了一个 BsonTool.objectToBsonValue() 方法:

public class BsonTool {

    /**
     * Java对象转BsonValue对象
     * @param obj
     * @return
     */
    public static BsonValue objectToBsonValue(Object obj){
        if (obj instanceof Integer){
            return new BsonInt32((Integer) obj);
        }

        if (obj instanceof String){
            return new BsonString((String) obj);
        }

        if (obj instanceof Long){
            return new BsonInt64((Long) obj);
        }

        if (obj instanceof Date){
            return new BsonDateTime(((Date) obj).getTime());
        }
        return new BsonNull();
    }

}
这个工具类中,没有把类型覆盖全,只覆盖了我需要的一些类型,可按需添加。
最后只需将 set("data", userData)  =>>  set("data", bsonArray),搞定,错误解决。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值