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() + "\"}");
+ }
}