From 289438b1e4c2695bb464d21471f1993df05f2285 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 25 Apr 2023 10:03:16 +0200 Subject: [PATCH] Fix regression in value to String mapping. Previous versions allow arbitrary values to be mapped to an string property by calling the ObjectToString converter. This behaviour got lost and is not reestablished. Closes #4371 Original pull request #4373 --- .../mongodb/core/convert/MappingMongoConverter.java | 9 +++------ .../core/convert/MappingMongoConverterUnitTests.java | 12 ++++++++++++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java index 5ed2af8e9..2bfb90150 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java @@ -2313,8 +2313,10 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App if (source instanceof Collection collection) { Class rawType = typeHint.getType(); - if (!Object.class.equals(rawType)) { + if (!Object.class.equals(rawType) && !String.class.equals(rawType)) { + if (!rawType.isArray() && !ClassUtils.isAssignable(Iterable.class, rawType)) { + throw new MappingException( String.format(INCOMPATIBLE_TYPES, source, source.getClass(), rawType, getPath())); } @@ -2343,11 +2345,6 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App return (S) dbRefConverter.convert(context, dbRef, typeHint); } - if (source instanceof Collection) { - throw new MappingException( - String.format(INCOMPATIBLE_TYPES, source, BasicDBList.class, typeHint.getType(), getPath())); - } - if (BsonUtils.supportsBson(source)) { return (S) documentConverter.convert(context, BsonUtils.asBson(source), typeHint); } 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 cf2b59a0a..46d23f831 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 @@ -2831,6 +2831,18 @@ class MappingMongoConverterUnitTests { assertThat(converter.read(Cyclic.class, source).cycle.value).isEqualTo("v2"); } + @Test // GH-4371 + void shouldConvertTypesToStringTargetType() { + + org.bson.Document source = org.bson.Document.parse(""" + { + city : ["Gotham", "Metropolis"] + } + """); + + assertThat(converter.read(Address.class, source).city).isEqualTo("Gotham,Metropolis"); + } + static class GenericType { T content; }