diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoConverters.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoConverters.java index 70f8fa732..1ab8bb627 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoConverters.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoConverters.java @@ -27,14 +27,18 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Currency; import java.util.List; +import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import org.bson.BsonReader; import org.bson.BsonTimestamp; +import org.bson.BsonWriter; import org.bson.Document; -import org.bson.UuidRepresentation; import org.bson.codecs.Codec; -import org.bson.internal.CodecRegistryHelper; +import org.bson.codecs.DecoderContext; +import org.bson.codecs.EncoderContext; +import org.bson.codecs.configuration.CodecRegistries; import org.bson.types.Binary; import org.bson.types.Code; import org.bson.types.Decimal128; @@ -240,9 +244,23 @@ abstract class MongoConverters { INSTANCE; - private final Codec codec = CodecRegistryHelper - .createRegistry(MongoClientSettings.getDefaultCodecRegistry(), UuidRepresentation.JAVA_LEGACY) - .get(Document.class); + private final Codec codec = CodecRegistries.fromRegistries(CodecRegistries.fromCodecs(new Codec() { + + @Override + public void encode(BsonWriter writer, UUID value, EncoderContext encoderContext) { + writer.writeString(value.toString()); + } + + @Override + public Class getEncoderClass() { + return UUID.class; + } + + @Override + public UUID decode(BsonReader reader, DecoderContext decoderContext) { + throw new IllegalStateException("decode not supported"); + } + }), MongoClientSettings.getDefaultCodecRegistry()).get(Document.class); @Override public String convert(Document source) { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MongoConvertersUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MongoConvertersUnitTests.java index 7e9c7323f..88cf3314d 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MongoConvertersUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MongoConvertersUnitTests.java @@ -22,6 +22,7 @@ import java.net.URI; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.Currency; +import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; @@ -29,7 +30,6 @@ import org.assertj.core.data.TemporalUnitLessThanOffset; import org.bson.BsonTimestamp; import org.bson.Document; import org.junit.jupiter.api.Test; - import org.springframework.core.convert.support.ConfigurableConversionService; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.data.geo.Box; @@ -42,6 +42,7 @@ import org.springframework.data.mongodb.core.convert.MongoConverters.AtomicLongT import org.springframework.data.mongodb.core.convert.MongoConverters.BigDecimalToStringConverter; import org.springframework.data.mongodb.core.convert.MongoConverters.BsonTimestampToInstantConverter; import org.springframework.data.mongodb.core.convert.MongoConverters.CurrencyToStringConverter; +import org.springframework.data.mongodb.core.convert.MongoConverters.DocumentToStringConverter; import org.springframework.data.mongodb.core.convert.MongoConverters.IntegerToAtomicIntegerConverter; import org.springframework.data.mongodb.core.convert.MongoConverters.LongToAtomicLongConverter; import org.springframework.data.mongodb.core.convert.MongoConverters.StringToBigDecimalConverter; @@ -173,4 +174,12 @@ public class MongoConvertersUnitTests { assertThat(conversionService.convert(URI.create("/segment"), String.class)).isEqualTo("/segment"); assertThat(conversionService.convert("/segment", URI.class)).isEqualTo(URI.create("/segment")); } + + @Test // GH-3546 + void convertsDocumentWithUUidToString() { + + UUID uuid = UUID.randomUUID(); + assertThat(DocumentToStringConverter.INSTANCE.convert(new Document("_id", uuid))) + .isEqualTo("{\"_id\": \"" + uuid.toString() + "\"}"); + } }