Spring Data Entity UUID 在 MongoDB 中作为遗留 UUID 存储



我正在将一些数据转储到我的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存储为二进制/type4?

在 SpringBoot 2 中,对于 Spring MongoDB 3.x,您可以使用自动配置属性进行设置:

# Options: unspecified, standard, c_sharp_legacy, java_legacy, python_legacy
spring.data.mongodb.uuid-representation=standard

在 Spring Data 的 3.x 版上,Mongo 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());

您可以在 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 引导版本 2.2.0.RELEASEAbstractMongoConfiguration被弃用,这不再有效。我为此发了一篇文章,也许这是一个错误,或者也许有人知道答案:Spring Boot Standard UUID 编解码器不适用于 AbstractMongoClientConfiguration

就我而言,application.yml 中的属性不如使用编解码器注册表的属性工作得好。我的工作解决方案是:

MongoConfig.java

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

最新更新