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 eaf06b8db..29802fb99 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 @@ -2329,8 +2329,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())); } @@ -2359,11 +2361,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 79e15e0f0..10c189c11 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 @@ -2858,6 +2858,14 @@ 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("{\n" + " city : [\"Gotham\", \"Metropolis\"]\n" + "}\n"); + + assertThat(converter.read(Address.class, source).city).isEqualTo("Gotham,Metropolis"); + } + static class GenericType { T content; }