UUID Spring Data Entity хранится как устаревший UUID в MongoDB - PullRequest
0 голосов
/ 25 октября 2019

Я сбрасываю некоторые данные в мой MongoDb и генерирую UUID в пути. В коллекции это поле UUID хранится как LUUID (устаревший UUID - тип 3), и я не знаю, как этого избежать, потому что я хотел бы, чтобы формат был стандартным UUID (тип 4).

Entity:

@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);}
    }
}

Repo:

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

Служба, хранящая эту сущность:

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

Все, что мне нужно аннотировать или настроить для сохранения UUID в виде двоичного файла/ type4

1 Ответ

0 голосов
/ 31 октября 2019

Вы можете установить кодек UUID в вашей конфигурации Mongo. Это сохранит ваши UUID с кодеком типа 4. Код, который вам нужно сделать, следующий:

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());
    }
}

Внимание : с новой пружинойЗагрузочная версия 2.2.0.RELEASE AbstractMongoConfiguration устарела, и это больше не работает. Я сделал сообщение для этого, может быть, это ошибка, или, возможно, кто-то знает ответ: Стандартный кодек UUID Spring Boot не работает с AbstractMongoClientConfiguration

...