Spring Data Entity中的UUID以传统UUID的形式存储在MongoDB中。

6

我正在将一些数据转储到我的MongoDb中,并在此过程中生成UUID。在集合中,这个UUID字段存储为LUUID(遗留UUID - 类型3),我不知道如何避免这种情况,因为我希望格式为标准UUID(类型4)。

实体:

@Document(collection = "sms")
public class SmsEntity {
    ...
    private UUID ubmMessageSid;  // <- this field gets stored as LUUID
    ...

    public static class Builder {
    ...
        private UUID ubmMessageSid;
    ...

        public Builder ubmMessageSid(UUID ubmMessageSid) {
            this.ubmMessageSid = ubmMessageSid;
            return this;
        }

        public SmsEntity build() {return new SmsEntity(this);}
    }
}

代码库:

@Repository
public interface SmsRepository extends CrudRepository<SmsEntity, String> {
}

存储此实体的服务:

...
var ubmId = UUID.randomUUID();
var smsEntity = SmsEntity.builder()
    .ubmMessageSid(ubmId)
    ...
    .build();
repository.save(smsEntity);

我需要注释或配置什么来将UUID存储为二进制/类型4吗?

4个回答

7
在Spring Boot 2中,针对Spring MongoDB 3.x,您可以使用自动配置属性进行设置:
# Options: unspecified, standard, c_sharp_legacy, java_legacy, python_legacy
spring.data.mongodb.uuid-representation=standard

3

在Spring Data Mongo的3.x版本中,MongoClient已被MongoClientSettings取代:

CodecRegistry codecRegistry =
  CodecRegistries.fromRegistries(CodecRegistries.fromCodecs(new UuidCodec(UuidRepresentation.JAVA_LEGACY)),
    MongoClientSettings.getDefaultCodecRegistry());

return new MongoClient(new ServerAddress(address, port), MongoClientSettings.builder().codecRegistry(codecRegistry).build());

我认为你不能使用return new MongoClient(...),而是需要使用return MongoClients.create(...);更多信息请参见此处 - Zap

2

您可以在Mongo配置中设置UUID编解码器,这将使用类型4编解码器保留您的UUID。您需要执行的代码如下:

CodecRegistries.fromRegistries(CodecRegistries.fromCodecs(new UuidCodec(UuidRepresentation.STANDARD)),
                        MongoClient.getDefaultCodecRegistry());
        return new MongoClient(new ServerAddress(address, port), MongoClientOptions.builder().codecRegistry(codecRegistry).build());

以下是完整的类,以防万一:
```

这里是完整的类,以防万一:

```
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.ServerAddress;
import org.bson.UuidRepresentation;
import org.bson.codecs.UuidCodec;
import org.bson.codecs.configuration.CodecRegistries;
import org.bson.codecs.configuration.CodecRegistry;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
import org.springframework.data.mongodb.core.mapping.event.ValidatingMongoEventListener;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;

@Configuration
@EnableAutoConfiguration
@EnableMongoRepositories(basePackages = "com.yourpackage.repositories")
public class MongoConfig extends AbstractMongoConfiguration {
    @Value("${mongo.database}")
    String database;
    @Value("${mongo.address}")
    String address;
    @Value("${mongo.port}")
    Integer port;

    @Override
    protected String getDatabaseName() {
        return database;
    }

    @Override
    public MongoClient mongoClient() {
        CodecRegistry codecRegistry =
                CodecRegistries.fromRegistries(CodecRegistries.fromCodecs(new UuidCodec(UuidRepresentation.STANDARD)),
                        MongoClient.getDefaultCodecRegistry());
        return new MongoClient(new ServerAddress(address, port), MongoClientOptions.builder().codecRegistry(codecRegistry).build());
    }

    @Bean
    public LocalValidatorFactoryBean localValidatorFactoryBean() {
        return new LocalValidatorFactoryBean();
    }

    @Bean
    public ValidatingMongoEventListener validatingMongoEventListener() {
        return new ValidatingMongoEventListener(localValidatorFactoryBean());
    }
}
注意:随着新的Spring Boot版本2.2.0.RELEASE,AbstractMongoConfiguration已经过时,不再起作用。我为此发布了一篇文章,也许这是一个bug,或者有人知道答案:Spring Boot标准UUID编解码器与AbstractMongoClientConfiguration不兼容

0
在我的情况下,application.yml 文件中的属性与使用 CodecRegistries 的属性一样都无法正常工作。我的解决方案是:

MongoConfig.java:

    @Bean
    public MongoClient mongoClient() {
        MongoClientSettings.Builder builder = MongoClientSettings.builder();
        builder.uuidRepresentation(UuidRepresentation.JAVA_LEGACY);
        return MongoClients.create(builder.build());
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接