MongoDB Map<K,V> codec报错Maps MUST have string keys问题问询
MongoDB驱动Enum作为Map键报错问题说明及解决方案
Maps MUST have string keys, found class Enum instead报错的根因来自BSON规范的底层限制:MongoDB存储的文档所有字段键必须为字符串类型,MongoDB驱动默认未提供Enum键到字符串的自动转换,是为了避免隐式转换导致后续查询时类型不匹配的隐性问题,不属于驱动缺陷。
官方处理进展
官方相关需求目前已经明确不会在驱动默认层面支持该自动转换,但是开放了自定义Codec的扩展能力,允许开发者根据自身业务需求自定义转换规则。
Quarkus框架适配方案
Quarkus的MongoDB扩展原生支持自定义Codec的自动注册,无需修改框架核心逻辑,按以下步骤操作即可完成适配:
- 自定义实现支持Enum类型键的Map Codec,序列化阶段将Enum键按业务规则(如调用
name()方法、自定义枚举值方法)转换为字符串,反序列化阶段根据目标Map的泛型参数将字符串转回对应Enum实例 - 将自定义Codec实现类声明为Quarkus的
@ApplicationScopedBean,框架会自动将其注入MongoDB客户端的Codec注册表中,全局生效
优化实现思路
相比业务代码中每次存储前手动遍历Map转换键的实现,自定义Codec的方式全局生效,对业务代码无侵入,也可以兼容嵌套Map、Enum实现自定义序列化值等复杂场景。如果需要兼容不同Enum的不同转换规则,还可以在Codec中添加注解识别逻辑,针对加了自定义序列化注解的Enum走对应转换规则。
内容的提问来源于stack exchange,提问作者Yuna Braska
相关产品推荐
相关产品推荐

