UUID 表示为 Bson 字符串

UUID represented as Bson String

我想我确实有一个简单的用例,但我正在努力让它与 MongoDB 一起工作。

我有一个 POJO 看起来像

public class Item {
  @BsonRepresentation(value = BsonType.STRING)
  private UUID id;
  private String version;
  // more..

  // getter/setters
}

您看到 POJO 的 ID 指定为 UUID。但是Bson表示是一个字符串。

我试图只为 UUID class 编写自定义编解码器,但这实际上不起作用。注册表看起来像

CodecRegistry codecRegistry = CodecRegistries.fromRegistries(
    MongoClientSettings.getDefaultCodecRegistry(),
    fromProviders(PojoCodecProvider.builder().automatic(true).build()),
    CodecRegistries.fromCodecs(
            new UuidCodec()
    )
)

我只想为 UUID 编写编解码器,而不是为整个项目编写编解码器 class。但是我认为我真的走错了方向,我需要任何帮助。应该如何实施?

感谢@fabiolimace 的输入,我实现了一个简单的 PropertyCodecProvider,其中 returns 用于 UUID 类型下面的编解码器

public class UuidCodec implements Codec<UUID> {
 @Override
 public void encode(BsonWriter writer, UUID value, EncoderContext encoderContext) {
    if (value != null) {
        writer.writeString(value.toString());
    }
 }

 @Override
 public UUID decode(BsonReader reader, DecoderContext decoderContext) {
    String uuidString = reader.readString();
    if (uuidString == null || uuidString.isEmpty()) {
        return null;
    }

    return UUID.fromString(uuidString);
 }

 @Override
 public Class<UUID> getEncoderClass() {
    return UUID.class;
 }
}

希望这对面临类似挑战的其他人有所帮助。