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 !