You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BSON文档存取MutableMap<String,Int>时出现Integer转String类转换异常如何解决

问题根因

BSON文档强制要求所有键必须为字符串类型,你当前报错的核心原因是account.collectionLog.clicked声明的泛型为MutableMap<String, Int>,但运行时实际存储的Map键为Int类型。由于JVM泛型擦除机制,该类型不匹配问题编译阶段不会暴露,到BSON序列化/反序列化阶段就会抛出类型转换异常。

解决方案

你可以根据业务场景选择以下任意一种方案修复:

方案1:显式转换键类型(改动最小,推荐)

存储时把Int类型的键转为字符串,加载时再转回业务需要的类型即可:

addSaver("log") { account->
    val doc = Document()
    // 键转String后存入BSON
    val saveClicked = account.collectionLog.clicked.mapKeys { it.key.toString() }
    doc.append("clicked", saveClicked)
}

addLoader("log") { account, doc ->
    val loadedMap = doc["clicked"] as MutableMap<String, Int>
    // 如果业务需要Int键就加这一步转回;如果业务本身就应该用String键,直接赋值即可
    account.collectionLog.clicked = loadedMap.mapKeys { it.key.toInt() } as MutableMap<Int, Int>
}

方案2:改用列表存储键值对

如果不想做类型转换,也可以把Map拆分为键值对列表存储,避开BSON对键的类型限制:

addSaver("log") { account->
    val doc = Document()
    val clickedList = account.collectionLog.clicked.map { (k, v) -> 
        Document("key", k).append("value", v) 
    }
    doc.append("clicked", clickedList)
}

addLoader("log") { account, doc ->
    val loadedList = doc["clicked"] as List<Document>
    account.collectionLog.clicked = loadedList.associate { 
        it.getInteger("key") to it.getInteger("value") 
    } as MutableMap<Int, Int>
}

内容的提问来源于stack exchange,提问作者Rune Tool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:00:03