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 c12e5078a..27a298922 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 @@ -2315,8 +2315,10 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App if (source instanceof 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())); } @@ -2345,11 +2347,6 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App return (S) dbRefConverter.convert(context, (DBRef) source, 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 ad6b5135c..e9b3af915 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; }