From 8b060455c292514b34d5b783acef985d811074d7 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 8 Feb 2021 12:33:18 +0100 Subject: [PATCH] Fix DocumentToStringConverter UUID representation when calling toJson. This commit makes sure to use an Encoder having UuidRepresentation set when calling org.bson.Document#toJson, preventing CodecConfigurationException from being raised. Future versions will make sure the UUID string representation matches the Java default one. Closes #3546. Original pull request: #3551. --- .../data/mongodb/core/convert/MongoConverters.java | 12 ++++++++++-- .../core/convert/MappingMongoConverterUnitTests.java | 9 +++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) 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 7e4b37cd8..70f8fa732 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 @@ -32,6 +32,9 @@ import java.util.concurrent.atomic.AtomicLong; import org.bson.BsonTimestamp; import org.bson.Document; +import org.bson.UuidRepresentation; +import org.bson.codecs.Codec; +import org.bson.internal.CodecRegistryHelper; import org.bson.types.Binary; import org.bson.types.Code; import org.bson.types.Decimal128; @@ -45,11 +48,12 @@ import org.springframework.data.convert.ReadingConverter; 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 +240,13 @@ abstract class MongoConverters { INSTANCE; + private final Codec codec = CodecRegistryHelper + .createRegistry(MongoClientSettings.getDefaultCodecRegistry(), UuidRepresentation.JAVA_LEGACY) + .get(Document.class); + @Override public String convert(Document source) { - return source.toJson(); + return source.toJson(codec); } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java index 198a5f8ae..4fe44c7e0 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java @@ -2181,6 +2181,15 @@ public class MappingMongoConverterUnitTests { assertThat(((LinkedHashMap) result.get("cluster")).get("_id")).isEqualTo(100L); } + @Test // GH-3546 + void readFlattensNestedDocumentToStringIfNecessary() { + + org.bson.Document source = new org.bson.Document("street", new org.bson.Document("json", "string").append("_id", UUID.randomUUID())); + + Address target = converter.read(Address.class, source); + assertThat(target.street).isNotNull(); + } + @Test // DATAMONGO-1902 void writeFlattensEmbeddedType() {