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

MongoDB POJO中UUID以Bson String存储时自定义UUID编解码器不生效如何解决

问题根因
  • CodecRegistry注册顺序错误:MongoDB的CodecRegistry会按照fromRegistries方法传入的参数顺序从前到后匹配对应类型的编解码器,你当前将自定义UuidCodec放在注册顺序的最后一位,前置的默认CodecRegistry已经内置了UUID类型的编解码器,会被优先匹配,自定义编解码器永远不会触发。
  • 若你的自定义UuidCodec未正确实现getEncoderClass方法返回UUID.class,也会导致编解码器无法被正确识别匹配。
正确实现方案
  1. 调整CodecRegistry的注册顺序,将自定义编解码器放在最前面,保证优先匹配:
CodecRegistry codecRegistry = CodecRegistries.fromRegistries(
    // 自定义Codec放在注册顺序首位,优先生效
    CodecRegistries.fromCodecs(new UuidCodec()),
    MongoClientSettings.getDefaultCodecRegistry(),
    fromProviders(PojoCodecProvider.builder().automatic(true).build())
);
  1. 确保自定义UuidCodec的实现符合字符串存储的要求,参考实现如下:
public class UuidCodec implements Codec<UUID> {
    @Override
    public void encode(BsonWriter writer, UUID value, EncoderContext encoderContext) {
        // 直接写入UUID的字符串格式,和@BsonRepresentation要求的存储格式一致
        writer.writeString(value.toString());
    }

    @Override
    public UUID decode(BsonReader reader, DecoderContext decoderContext) {
        return UUID.fromString(reader.readString());
    }

    @Override
    public Class<UUID> getEncoderClass() {
        // 必须返回UUID.class,才能被正确匹配到UUID类型的字段
        return UUID.class;
    }
}
  1. 若调整后仍有冲突,可以移除POJO字段上的@BsonRepresentation(value = BsonType.STRING)注解,自定义编解码器已经直接处理了UUID和字符串的互转逻辑,无需额外注解声明。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:06:01