【问题标题】:UUID represented as Bson StringUUID 表示为 Bson 字符串
【发布时间】:2022-01-11 17:47:46
【问题描述】:

我认为我确实有一个简单的用例,但我正在努力让它与 MongoDB 一起使用。

我有一个 POJO,看起来像

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

  // getter/setters
}

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

我尝试仅为 UUID 类编写自定义编解码器,但这并没有真正奏效。注册表看起来像

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

我想只为 UUID 情况而不是整个 Item 类编写编解码器。但我认为我真的走错了方向,我需要任何帮助。这应该如何实现?

【问题讨论】:

标签: java mongodb uuid codec bson


【解决方案1】:

感谢@fabiolimace 的输入,我实现了一个简单的 PropertyCodecProvider,它为 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;
 }
}

希望这可以帮助其他面临类似挑战的人。

【讨论】:

    猜你喜欢
    • 2015-05-08
    • 2020-03-02
    • 2010-10-20
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多