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
相关产品推荐
相关产品推荐

