diff --git a/pom.xml b/pom.xml index 10c1adf1bf..c44e2991da 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 3.2.0-SNAPSHOT + 3.2.0-GH-3546-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml index f0fbb601c8..dcb07d01c3 100644 --- a/spring-data-mongodb-benchmarks/pom.xml +++ b/spring-data-mongodb-benchmarks/pom.xml @@ -7,7 +7,7 @@ org.springframework.data spring-data-mongodb-parent - 3.2.0-SNAPSHOT + 3.2.0-GH-3546-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index 1a17321782..2aada8b5f6 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -14,7 +14,7 @@ org.springframework.data spring-data-mongodb-parent - 3.2.0-SNAPSHOT + 3.2.0-GH-3546-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 0248517caf..523afe36ad 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -11,7 +11,7 @@ org.springframework.data spring-data-mongodb-parent - 3.2.0-SNAPSHOT + 3.2.0-GH-3546-SNAPSHOT ../pom.xml 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 7e4b37cd83..efc1c1a2e4 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,11 +27,18 @@ 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.codecs.Codec; +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; @@ -45,11 +52,12 @@ import org.springframework.data.convert.WritingConverter; import org.springframework.data.mongodb.core.query.Term; import org.springframework.data.mongodb.core.script.NamedMongoScript; -import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.NumberUtils; import org.springframework.util.StringUtils; +import com.mongodb.MongoClientSettings; + /** * Wrapper class to contain useful converters for the usage with Mongo. * @@ -236,9 +244,27 @@ enum DocumentToStringConverter implements Converter { INSTANCE; + 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) { - return source.toJson(); + return source.toJson(codec); } } @@ -268,7 +294,7 @@ enum DocumentToNamedMongoScriptConverter implements Converter { T content; } 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 7e9c7323f7..f7c67a09f9 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.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.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.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; @@ -55,10 +56,10 @@ * @author Thomas Darimont * @author Christoph Strobl */ -public class MongoConvertersUnitTests { +class MongoConvertersUnitTests { @Test - public void convertsBigDecimalToStringAndBackCorrectly() { + void convertsBigDecimalToStringAndBackCorrectly() { BigDecimal bigDecimal = BigDecimal.valueOf(254, 1); String value = BigDecimalToStringConverter.INSTANCE.convert(bigDecimal); @@ -69,7 +70,7 @@ public void convertsBigDecimalToStringAndBackCorrectly() { } @Test // DATAMONGO-858 - public void convertsBoxToDocumentAndBackCorrectly() { + void convertsBoxToDocumentAndBackCorrectly() { Box box = new Box(new Point(1, 2), new Point(3, 4)); @@ -80,7 +81,7 @@ public void convertsBoxToDocumentAndBackCorrectly() { } @Test // DATAMONGO-858 - public void convertsCircleToDocumentAndBackCorrectly() { + void convertsCircleToDocumentAndBackCorrectly() { Circle circle = new Circle(new Point(1, 2), 3); @@ -91,7 +92,7 @@ public void convertsCircleToDocumentAndBackCorrectly() { } @Test // DATAMONGO-858 - public void convertsPolygonToDocumentAndBackCorrectly() { + void convertsPolygonToDocumentAndBackCorrectly() { Polygon polygon = new Polygon(new Point(1, 2), new Point(2, 3), new Point(3, 4), new Point(5, 6)); @@ -102,7 +103,7 @@ public void convertsPolygonToDocumentAndBackCorrectly() { } @Test // DATAMONGO-858 - public void convertsSphereToDocumentAndBackCorrectly() { + void convertsSphereToDocumentAndBackCorrectly() { Sphere sphere = new Sphere(new Point(1, 2), 3); @@ -113,7 +114,7 @@ public void convertsSphereToDocumentAndBackCorrectly() { } @Test // DATAMONGO-858 - public void convertsPointToListAndBackCorrectly() { + void convertsPointToListAndBackCorrectly() { Point point = new Point(1, 2); @@ -124,44 +125,44 @@ public void convertsPointToListAndBackCorrectly() { } @Test // DATAMONGO-1372 - public void convertsCurrencyToStringCorrectly() { + void convertsCurrencyToStringCorrectly() { assertThat(CurrencyToStringConverter.INSTANCE.convert(Currency.getInstance("USD"))).isEqualTo("USD"); } @Test // DATAMONGO-1372 - public void convertsStringToCurrencyCorrectly() { + void convertsStringToCurrencyCorrectly() { assertThat(StringToCurrencyConverter.INSTANCE.convert("USD")).isEqualTo(Currency.getInstance("USD")); } @Test // DATAMONGO-1416 - public void convertsAtomicLongToLongCorrectly() { + void convertsAtomicLongToLongCorrectly() { assertThat(AtomicLongToLongConverter.INSTANCE.convert(new AtomicLong(100L))).isEqualTo(100L); } @Test // DATAMONGO-1416 - public void convertsAtomicIntegerToIntegerCorrectly() { + void convertsAtomicIntegerToIntegerCorrectly() { assertThat(AtomicIntegerToIntegerConverter.INSTANCE.convert(new AtomicInteger(100))).isEqualTo(100); } @Test // DATAMONGO-1416 - public void convertsLongToAtomicLongCorrectly() { + void convertsLongToAtomicLongCorrectly() { assertThat(LongToAtomicLongConverter.INSTANCE.convert(100L)).isInstanceOf(AtomicLong.class); } @Test // DATAMONGO-1416 - public void convertsIntegerToAtomicIntegerCorrectly() { + void convertsIntegerToAtomicIntegerCorrectly() { assertThat(IntegerToAtomicIntegerConverter.INSTANCE.convert(100)).isInstanceOf(AtomicInteger.class); } @Test // DATAMONGO-2113 - public void convertsBsonTimestampToInstantCorrectly() { + void convertsBsonTimestampToInstantCorrectly() { assertThat(BsonTimestampToInstantConverter.INSTANCE.convert(new BsonTimestamp(6615900307735969796L))) .isCloseTo(Instant.ofEpochSecond(1540384327), new TemporalUnitLessThanOffset(100, ChronoUnit.MILLIS)); } @Test // DATAMONGO-2210 - public void convertsUrisToString() { + void convertsUrisToString() { MongoCustomConversions conversions = new MongoCustomConversions(); @@ -173,4 +174,12 @@ public void convertsUrisToString() { 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() + "\"}"); + } }