Fix converter registration when using driver native time codec.

This commit prevents converters from being used as writing converter causing asymmetric write/read operations.

Closes #4390
Original pull request: #4392
This commit is contained in:
Christoph Strobl
2023-05-22 10:36:53 +02:00
committed by Mark Paluch
parent 37fb6f5712
commit 5f9b0f003f
3 changed files with 40 additions and 2 deletions

View File

@@ -42,6 +42,7 @@ import org.springframework.data.convert.PropertyValueConversions;
import org.springframework.data.convert.PropertyValueConverter;
import org.springframework.data.convert.PropertyValueConverterFactory;
import org.springframework.data.convert.PropertyValueConverterRegistrar;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.SimplePropertyValueConversions;
import org.springframework.data.convert.WritingConverter;
import org.springframework.data.mapping.model.SimpleTypeHolder;
@@ -370,6 +371,7 @@ public class MongoCustomConversions extends org.springframework.data.convert.Cus
}, this.propertyValueConversions);
}
@ReadingConverter
private enum DateToUtcLocalDateTimeConverter implements Converter<Date, LocalDateTime> {
INSTANCE;
@@ -379,6 +381,7 @@ public class MongoCustomConversions extends org.springframework.data.convert.Cus
}
}
@ReadingConverter
private enum DateToUtcLocalTimeConverter implements Converter<Date, LocalTime> {
INSTANCE;
@@ -388,6 +391,7 @@ public class MongoCustomConversions extends org.springframework.data.convert.Cus
}
}
@ReadingConverter
private enum DateToUtcLocalDateConverter implements Converter<Date, LocalDate> {
INSTANCE;

View File

@@ -39,13 +39,11 @@ import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import org.bson.Document;
import org.bson.types.ObjectId;
import org.joda.time.DateTime;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.convert.converter.Converter;
@@ -67,6 +65,8 @@ import org.springframework.data.mongodb.InvalidMongoDbApiUsageException;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.BulkOperations.BulkMode;
import org.springframework.data.mongodb.core.convert.LazyLoadingProxy;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions.MongoConverterConfigurationAdapter;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import org.springframework.data.mongodb.core.index.Index;
import org.springframework.data.mongodb.core.index.IndexField;
@@ -1787,6 +1787,30 @@ public class MongoTemplateTests {
assertThat(result.get(0).date).isNotNull();
}
@Test // GH-4390
void nativeDriverDateTimeCodecShouldBeApplied/*when configured*/() {
MongoTestTemplate ops = new MongoTestTemplate(cfg -> {
cfg.configureConversion(conversion -> {
conversion.customConversions(
MongoCustomConversions.create(MongoConverterConfigurationAdapter::useNativeDriverJavaTimeCodecs));
});
});
TypeWithDate source = new TypeWithDate();
source.id = "id-1";
source.date = Date.from(Instant.now());
ops.save(source);
Object dbDate = ops.execute(TypeWithDate.class,
collection -> collection.find(new org.bson.Document("_id", source.id)).first().get("date"));
TypeWithDate target = ops.findOne(query(where("date").is(source.date)), TypeWithDate.class);
assertThat(target.date).isEqualTo(source.date).isEqualTo(dbDate);
}
@Test // DATAMONGO-540
public void findOneAfterUpsertForNonExistingObjectReturnsTheInsertedObject() {

View File

@@ -64,6 +64,16 @@ class MongoCustomConversionsUnitTests {
assertThat(conversions.getPropertyValueConversions().hasValueConverter(persistentProperty)).isTrue();
}
@Test // GH-4390
void doesNotReturnConverterForNativeTimeTimeIfUsingDriverCodec() {
MongoCustomConversions conversions = MongoCustomConversions.create(config -> {
config.useNativeDriverJavaTimeCodecs();
});
assertThat(conversions.getCustomWriteTarget(Date.class)).isEmpty();
}
static class DateToZonedDateTimeConverter implements Converter<Date, ZonedDateTime> {
@Override