mongock / mongock

Lightweight Java based migration tool

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Can not use Mongock with replacement for BSON type DATE_TIME

olivierboudet opened this issue · comments

Description

I am trying to upgrade to mongock 5.2.1 with Spring Boot 3.0.
I am using a mongo driver with replacement to use LocalDateTime for type DATE_TIME as following :

public MongoClientSettings mongoClientSettings() {
        CodecRegistry codecRegistry = getCodecRegistry();

        return MongoClientSettings.builder().codecRegistry(codecRegistry).build();
    }

private CodecRegistry getCodecRegistry() {
    Map<BsonType, Class<?>> replacements = new EnumMap<>(BsonType.class);
    replacements.put(BsonType.DATE_TIME, LocalDateTime.class);
    BsonTypeClassMap bsonTypeClassMap = new BsonTypeClassMap(replacements);

    return fromRegistries(
            fromProviders(
                    new ValueCodecProvider(),
                    new BsonValueCodecProvider(),
                    new DocumentCodecProvider(bsonTypeClassMap, new DocumentToDBRefTransformer()),
                    new IterableCodecProvider(new DocumentToDBRefTransformer()),
                    new Jsr310CodecProvider(),
                    new BsonCodecProvider(),
                    new MapCodecProvider(),
                    new IterableCodecProvider(),
                    PojoCodecProvider.builder().automatic(true).build()
            ));
  }

As I use LocalDateTime, Document objects do not contain Date object. But I have a ClassCastException error in MongoSync4ChangeEntryRepository.java :

Caused by: java.lang.ClassCastException: class java.time.LocalDateTime cannot be cast to class java.util.Date (java.time.LocalDateTime and java.util.Date are in module java.base of loader 'bootstrap')
	at org.bson.Document.getDate(Document.java:353)
	at io.mongock.driver.mongodb.sync.v4.repository.MongoSync4ChangeEntryRepository.lambda$getEntriesLog$0(MongoSync4ChangeEntryRepository.java:115)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
	at io.mongock.driver.mongodb.sync.v4.repository.MongoSync4ChangeEntryRepository.getEntriesLog(MongoSync4ChangeEntryRepository.java:125)
	at io.mongock.driver.api.entry.ChangeEntryService.getEntriesMap(ChangeEntryService.java:70)
	at io.mongock.driver.api.entry.ChangeEntryService.getExecuted(ChangeEntryService.java:40)
	at io.mongock.runner.core.executor.ChangeExecutorBase.loadExecutedChangeEntries(ChangeExecutorBase.java:437)
	at io.mongock.runner.core.executor.system.SystemUpdateExecutor.executeMigration(SystemUpdateExecutor.java:65)
	at io.mongock.runner.core.executor.system.SystemUpdateExecutor.executeMigration(SystemUpdateExecutor.java:23)
	at io.mongock.runner.core.executor.MongockRunnerImpl.execute(MongockRunnerImpl.java:56)
	... 7 common frames omitted

In my case, in io.mongock.driver.mongodb.sync.v4.repository.MongoSync4ChangeEntryRepository#getEntriesLog, entry.getDate(KEY_TIMESTAMP) could not be used because KEY_TIMESTAMP field is a LocalDateTime object.

This issue does not occur with mongo 4.x

PRIORITY

Version and environment

Mongock

  • Mongock version : 5.2.1
  • Modules involved : springboot 3.0, io.mongock:mongodb-springdata-v4-driver:5.2.1
  • How Mongock is used : just using provided auto configuration

Environment

  • Framework and libraries versions : spring boot 3.0 (spring 6.0)
  • Infrastructure: Local development (gradle/Intellij)

Hello @olivierboudet. Thanks for raising the issue, we'll take a look and let you know.

Hello @olivierboudet , we've just released Mongock's version 5.2.4, which fixes this issue. Please could you try it and let us know? Thanks.

Yes it's perfect :) thanks !