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 fdaf46692..20cffb079 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 @@ -30,6 +30,8 @@ import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.*; +import javax.persistence.metamodel.EmbeddableType; + import org.assertj.core.api.Assertions; import org.bson.types.Code; import org.bson.types.Decimal128; @@ -2179,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(); + } + static class GenericType { T content; }